summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml26
-rw-r--r--admin/CPP-DEFINES2
-rw-r--r--admin/admin.el47
-rwxr-xr-xadmin/merge-gnulib2
-rw-r--r--configure.ac27
-rw-r--r--doc/emacs/emacs.texi11
-rw-r--r--doc/emacs/fixit.texi11
-rw-r--r--doc/emacs/maintaining.texi14
-rw-r--r--doc/lispref/backups.texi78
-rw-r--r--doc/lispref/files.texi16
-rw-r--r--doc/lispref/help.texi3
-rw-r--r--doc/lispref/minibuf.texi28
-rw-r--r--doc/lispref/variables.texi7
-rw-r--r--doc/misc/cc-mode.texi2
-rw-r--r--doc/misc/gnus.texi22
-rw-r--r--doc/misc/tramp.texi16
-rw-r--r--etc/NEWS127
-rw-r--r--etc/NEWS.272
-rw-r--r--etc/PROBLEMS6
-rw-r--r--etc/compilation.txt1
-rw-r--r--etc/themes/manoj-dark-theme.el8
-rw-r--r--etc/themes/modus-operandi-theme.el4266
-rw-r--r--etc/themes/modus-vivendi-theme.el4266
-rw-r--r--etc/w32-feature.el87
-rw-r--r--leim/SKK-DIC/SKK-JISYO.L4
-rw-r--r--lib/cdefs.h6
-rw-r--r--lib/diffseq.h128
-rw-r--r--lib/gnulib.mk.in16
-rw-r--r--lib/intprops.h15
-rw-r--r--lib/sig2str.c17
-rw-r--r--lib/sigdescr_np.c376
-rw-r--r--lib/string.in.h15
-rw-r--r--lib/verify.h45
-rw-r--r--lisp/allout.el15
-rw-r--r--lisp/auth-source.el4
-rw-r--r--lisp/calendar/todo-mode.el6
-rw-r--r--lisp/cedet/data-debug.el2
-rw-r--r--lisp/comint.el2
-rw-r--r--lisp/custom.el3
-rw-r--r--lisp/dired-aux.el15
-rw-r--r--lisp/dired.el33
-rw-r--r--lisp/doc-view.el45
-rw-r--r--lisp/emacs-lisp/bytecomp.el52
-rw-r--r--lisp/emacs-lisp/cl-lib.el7
-rw-r--r--lisp/emacs-lisp/edebug.el2
-rw-r--r--lisp/emacs-lisp/eieio-base.el259
-rw-r--r--lisp/emacs-lisp/gv.el18
-rw-r--r--lisp/emacs-lisp/lisp-mode.el4
-rw-r--r--lisp/emacs-lisp/nadvice.el8
-rw-r--r--lisp/emacs-lisp/seq.el2
-rw-r--r--lisp/emacs-lisp/shadow.el3
-rw-r--r--lisp/emacs-lisp/warnings.el12
-rw-r--r--lisp/epa-file.el6
-rw-r--r--lisp/epa.el137
-rw-r--r--lisp/eshell/em-hist.el2
-rw-r--r--lisp/ffap.el2
-rw-r--r--lisp/filecache.el3
-rw-r--r--lisp/fileloop.el8
-rw-r--r--lisp/files.el79
-rw-r--r--lisp/gnus/gnus-dbus.el70
-rw-r--r--lisp/gnus/gnus-group.el3
-rw-r--r--lisp/gnus/gnus-icalendar.el10
-rw-r--r--lisp/gnus/gnus-int.el9
-rw-r--r--lisp/gnus/gnus-msg.el2
-rw-r--r--lisp/gnus/gnus-start.el3
-rw-r--r--lisp/gnus/gnus.el4
-rw-r--r--lisp/gnus/mml.el2
-rw-r--r--lisp/help-at-pt.el5
-rw-r--r--lisp/help-fns.el2
-rw-r--r--lisp/help.el1
-rw-r--r--lisp/image-mode.el4
-rw-r--r--lisp/imenu.el22
-rw-r--r--lisp/info.el8
-rw-r--r--lisp/international/mule-cmds.el6
-rw-r--r--lisp/jsonrpc.el7
-rw-r--r--lisp/mail/rmail.el22
-rw-r--r--lisp/mail/smtpmail.el6
-rw-r--r--lisp/minibuf-eldef.el22
-rw-r--r--lisp/minibuffer.el31
-rw-r--r--lisp/mouse.el3
-rw-r--r--lisp/mwheel.el4
-rw-r--r--lisp/net/shr.el21
-rw-r--r--lisp/net/tramp-sh.el4
-rw-r--r--lisp/net/tramp.el198
-rw-r--r--lisp/progmodes/antlr-mode.el4
-rw-r--r--lisp/progmodes/cc-cmds.el13
-rw-r--r--lisp/progmodes/compile.el4
-rw-r--r--lisp/progmodes/cperl-mode.el8
-rw-r--r--lisp/progmodes/flymake-cc.el8
-rw-r--r--lisp/progmodes/hideshow.el6
-rw-r--r--lisp/progmodes/idlwave.el10
-rw-r--r--lisp/progmodes/make-mode.el2
-rw-r--r--lisp/progmodes/octave.el2
-rw-r--r--lisp/progmodes/project.el16
-rw-r--r--lisp/progmodes/vhdl-mode.el4
-rw-r--r--lisp/progmodes/xref.el19
-rw-r--r--lisp/progmodes/xscheme.el2
-rw-r--r--lisp/ps-print.el2
-rw-r--r--lisp/simple.el40
-rw-r--r--lisp/startup.el12
-rw-r--r--lisp/subr.el22
-rw-r--r--lisp/term.el55
-rw-r--r--lisp/textmodes/flyspell.el47
-rw-r--r--lisp/textmodes/ispell.el85
-rw-r--r--m4/gnulib-comp.m49
-rw-r--r--m4/inttypes.m44
-rw-r--r--m4/sigdescr_np.m417
-rw-r--r--m4/string_h.m46
-rw-r--r--src/character.c6
-rw-r--r--src/coding.c10
-rw-r--r--src/dispextern.h6
-rw-r--r--src/editfns.c121
-rw-r--r--src/fileio.c70
-rw-r--r--src/font.c4
-rw-r--r--src/ftfont.c4
-rw-r--r--src/gnutls.c9
-rw-r--r--src/gtkutil.c2
-rw-r--r--src/image.c220
-rw-r--r--src/keymap.c2
-rw-r--r--src/nsmenu.m2
-rw-r--r--src/regex-emacs.c61
-rw-r--r--src/syntax.c10
-rw-r--r--src/sysdep.c161
-rw-r--r--src/window.c6
-rw-r--r--src/xdisp.c48
-rw-r--r--test/data/themes/faces-test-dark-theme.el8
-rw-r--r--test/data/themes/faces-test-light-theme.el8
-rw-r--r--test/lisp/calendar/todo-mode-resources/todo-test-1.todo4
-rw-r--r--test/lisp/calendar/todo-mode-tests.el59
-rw-r--r--test/lisp/char-fold-tests.el8
-rw-r--r--test/lisp/electric-tests.el8
-rw-r--r--test/lisp/emacs-lisp/bytecomp-tests.el16
-rw-r--r--test/lisp/emacs-lisp/rmc-tests.el8
-rw-r--r--test/lisp/emacs-lisp/subr-x-tests.el8
-rw-r--r--test/lisp/emacs-lisp/text-property-search-tests.el8
-rw-r--r--test/lisp/emacs-lisp/warnings-tests.el60
-rw-r--r--test/lisp/faces-tests.el8
-rw-r--r--test/lisp/gnus/gnus-icalendar-tests.el20
-rw-r--r--test/lisp/gnus/mml-sec-tests.el8
-rw-r--r--test/lisp/hi-lock-tests.el8
-rw-r--r--test/lisp/isearch-tests.el8
-rw-r--r--test/lisp/json-tests.el8
-rw-r--r--test/lisp/jsonrpc-tests.el8
-rw-r--r--test/lisp/mail/footnote-tests.el8
-rw-r--r--test/lisp/minibuffer-tests.el8
-rw-r--r--test/lisp/net/tramp-tests.el227
-rw-r--r--test/lisp/progmodes/compile-tests.el4
-rw-r--r--test/lisp/progmodes/subword-tests.el8
-rw-r--r--test/lisp/simple-tests.el8
-rw-r--r--test/lisp/sort-tests.el8
-rw-r--r--test/lisp/textmodes/conf-mode-tests.el6
-rw-r--r--test/lisp/textmodes/css-mode-tests.el8
-rw-r--r--test/lisp/url/url-handlers-test.el8
-rw-r--r--test/lisp/wdired-tests.el6
-rw-r--r--test/manual/cedet/cedet-utests.el12
-rw-r--r--test/manual/cedet/semantic-tests.el4
-rw-r--r--test/manual/image-size-tests.el6
-rw-r--r--test/manual/image-transforms-tests.el50
-rw-r--r--test/manual/scroll-tests.el6
-rw-r--r--test/src/charset-tests.el8
-rw-r--r--test/src/chartab-tests.el8
-rw-r--r--test/src/cmds-tests.el8
-rw-r--r--test/src/doc-tests.el8
-rw-r--r--test/src/editfns-tests.el6
-rw-r--r--test/src/fileio-tests.el39
-rw-r--r--test/src/lread-tests.el6
-rw-r--r--test/src/print-tests.el6
-rw-r--r--test/src/process-tests.el8
-rw-r--r--test/src/timefns-tests.el8
169 files changed, 11152 insertions, 1627 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4522bb6bb4e..099b947dff1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -100,3 +100,29 @@ test-native-bootstrap-speed2:
- ./configure --without-makeinfo --with-nativecomp
- make bootstrap NATIVE_FAST_BOOT=1
timeout: 8 hours
+
+test-gnustep:
+ stage: test
+ # This tests the GNUstep build process
+ only:
+ changes:
+ - .gitlab-ci.yml
+ - configure.ac
+ - src/nsfns.m
+ - src/nsfont.m
+ - src/nsgui.h
+ - src/nsimage.m
+ - src/nsmenu.m
+ - src/nsselect.m
+ - src/nsterm.h
+ - src/nsterm.m
+ - src/nsxwidget.h
+ - src/nsxwidget.m
+ - src/macfont.h
+ - src/macfont.m
+ script:
+ - DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y -qq -o=Dpkg::Use-Pty=0 gnustep-devel
+ - ./autogen.sh autoconf
+ - ./configure --without-makeinfo --with-ns
+ - make bootstrap
+ - make install
diff --git a/admin/CPP-DEFINES b/admin/CPP-DEFINES
index ce9a44436d8..a40b4302723 100644
--- a/admin/CPP-DEFINES
+++ b/admin/CPP-DEFINES
@@ -124,9 +124,7 @@ HAVE_DECL_STRTOIMAX
HAVE_DECL_STRTOLL
HAVE_DECL_STRTOULL
HAVE_DECL_STRTOUMAX
-HAVE_DECL_SYS_SIGLIST
HAVE_DECL_TZNAME
-HAVE_DECL___SYS_SIGLIST
HAVE_DIALOGS
HAVE_DIFFTIME
HAVE_DUP2
diff --git a/admin/admin.el b/admin/admin.el
index 923f0100820..728aab8b1ae 100644
--- a/admin/admin.el
+++ b/admin/admin.el
@@ -151,7 +151,7 @@ Root must be the root of an Emacs source tree."
(display-warning 'admin
"NEWS file contains empty sections - remove them?"))
(goto-char (point-min))
- (if (re-search-forward "^\\(\\+\\+\\+ *\\|--- *\\)$" nil t)
+ (if (re-search-forward "^\\(\\+\\+\\+ *$\\|--- *$\\|Temporary note:\\)" nil t)
(display-warning 'admin
"NEWS file still contains temporary markup.
Documentation changes might not have been completed!"))))
@@ -921,6 +921,51 @@ changes (in a non-trivial way). This function does not check for that."
'help-echo "Mouse-2: visit this definition"
:type 'cusver-xref)))))))
+
+;; Reminder message for open release-blocking bugs. This requires the
+;; GNU ELPA package `debbugs'.
+
+(defun reminder-for-release-blocking-bugs (version)
+ "Submit a reminder message for release-blocking bugs of Emacs VERSION."
+ (interactive
+ (list (completing-read
+ "Emacs release: "
+ (mapcar #'identity debbugs-gnu-emacs-blocking-reports)
+ nil t debbugs-gnu-emacs-current-release)))
+
+ (require 'reporter)
+ (require 'debbugs-gnu)
+
+ (when-let ((id (alist-get version debbugs-gnu-emacs-blocking-reports
+ nil nil #'string-equal))
+ (status-id (debbugs-get-status id))
+ (blockedby-ids (debbugs-get-attribute (car status-id) 'blockedby))
+ (blockedby-status
+ (apply #'debbugs-get-status (sort blockedby-ids #'<))))
+
+ (reporter-submit-bug-report
+ "<emacs-devel@gnu.org>" ; to-address
+ nil nil nil
+ (lambda () ; posthook
+ (goto-char (point-min))
+ (mail-position-on-field "subject")
+ (insert (format "Release-blocking bugs for Emacs %s" version))
+ (mail-text)
+ (delete-region (point) (point-max))
+ (insert "
+The following bugs are regarded as release-blocking for Emacs " version ".
+People are encouraged to work on them with priority.\n\n")
+ (dolist (_ blockedby-status)
+ (unless (equal (debbugs-get-attribute _ 'pending) "done")
+ (insert (format "bug#%d %s\n"
+ (debbugs-get-attribute _ 'id)
+ (debbugs-get-attribute _ 'subject)))))
+ (insert "
+If you use the debbugs package from GNU ELPA, you can apply the
+following form to see all bugs which block a given release:
+
+ (debbugs-gnu-emacs-release-blocking-reports \"" version "\")\n")))))
+
(provide 'admin)
;;; admin.el ends here
diff --git a/admin/merge-gnulib b/admin/merge-gnulib
index 3f32536a629..164300e1db6 100755
--- a/admin/merge-gnulib
+++ b/admin/merge-gnulib
@@ -40,7 +40,7 @@ GNULIB_MODULES='
manywarnings memmem-simple mempcpy memrchr minmax mkostemp mktime nstrftime
pathmax pipe2 pselect pthread_sigmask
qcopy-acl readlink readlinkat regex
- sig2str socklen stat-time std-gnu11 stdalign stddef stdio
+ sig2str sigdescr_np socklen stat-time std-gnu11 stdalign stddef stdio
stpcpy strnlen strtoimax symlink sys_stat sys_time
tempname time time_r time_rz timegm timer-time timespec-add timespec-sub
update-copyright unlocked-io utimensat
diff --git a/configure.ac b/configure.ac
index cdc18eab19e..31484db0538 100644
--- a/configure.ac
+++ b/configure.ac
@@ -463,6 +463,7 @@ OPTION_DEFAULT_ON([m17n-flt],[don't use m17n-flt for text shaping])
OPTION_DEFAULT_ON([toolkit-scroll-bars],[don't use Motif/Xaw3d/GTK toolkit scroll bars])
OPTION_DEFAULT_ON([xaw3d],[don't use Xaw3d])
OPTION_DEFAULT_ON([xim],[at runtime, default X11 XIM to off])
+OPTION_DEFAULT_ON([xdbe],[don't use X11 double buffering support])
AC_ARG_WITH([ns],[AS_HELP_STRING([--with-ns],
[use Nextstep (macOS Cocoa or GNUstep) windowing system.
On by default on macOS.])],[],[with_ns=maybe])
@@ -1773,13 +1774,6 @@ dnl On Solaris 8 there's a compilation warning for term.h because
dnl it doesn't define 'bool'.
AC_CHECK_HEADERS(term.h, , , -)
AC_HEADER_TIME
-AC_CHECK_DECLS([sys_siglist], [], [], [[#include <signal.h>
- ]])
-if test $ac_cv_have_decl_sys_siglist != yes; then
- # For Tru64, at least:
- AC_CHECK_DECLS([__sys_siglist], [], [], [[#include <signal.h>
- ]])
-fi
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS_ONCE(sys/socket.h)
@@ -1907,7 +1901,8 @@ tmp_CPPFLAGS="$CPPFLAGS"
tmp_CFLAGS="$CFLAGS"
CPPFLAGS="$CPPFLAGS -x objective-c"
CFLAGS="$CFLAGS -x objective-c"
-GNU_OBJC_CFLAGS=
+# Recent versions of GCC don't use C99 to compile Obj-C.
+GNU_OBJC_CFLAGS="-std=c99"
LIBS_GNUSTEP=
if test "${with_ns}" != no; then
# macfont.o requires macuvs.h which is absent after 'make extraclean',
@@ -1923,7 +1918,7 @@ if test "${with_ns}" != no; then
elif flags=$( (gnustep-config --objc-flags) 2>/dev/null); then
NS_IMPL_GNUSTEP=yes
NS_GNUSTEP_CONFIG=yes
- GNU_OBJC_CFLAGS=$flags
+ GNU_OBJC_CFLAGS="$GNU_OBJC_CFLAGS $flags"
LIBS_GNUSTEP=$(gnustep-config --gui-libs) || exit
elif test -f $GNUSTEP_CONFIG_FILE; then
NS_IMPL_GNUSTEP=yes
@@ -1968,7 +1963,7 @@ fail;
dnl _NATIVE_OBJC_EXCEPTIONS is used by the GNUstep headers.
AC_DEFINE(_NATIVE_OBJC_EXCEPTIONS, 1,
[Define if GNUstep uses ObjC exceptions.])
- GNU_OBJC_CFLAGS="-fobjc-exceptions"
+ GNU_OBJC_CFLAGS="$GNU_OBJC_CFLAGS -fobjc-exceptions"
fi
fi
if test $NS_IMPL_GNUSTEP = yes; then
@@ -4121,11 +4116,13 @@ AC_SUBST(XFIXES_LIBS)
### Use Xdbe (-lXdbe) if available
HAVE_XDBE=no
if test "${HAVE_X11}" = "yes"; then
- AC_CHECK_HEADER(X11/extensions/Xdbe.h,
- [AC_CHECK_LIB(Xext, XdbeAllocateBackBufferName, HAVE_XDBE=yes)],
- [],
- [#include <X11/Xlib.h>
- ])
+ if test "${with_xdbe}" != "no"; then
+ AC_CHECK_HEADER(X11/extensions/Xdbe.h,
+ [AC_CHECK_LIB(Xext, XdbeAllocateBackBufferName, HAVE_XDBE=yes)],
+ [],
+ [#include <X11/Xlib.h>
+ ])
+ fi
if test $HAVE_XDBE = yes; then
XDBE_LIBS=-lXext
fi
diff --git a/doc/emacs/emacs.texi b/doc/emacs/emacs.texi
index 5b6b7b7e93e..6aed7bd92a5 100644
--- a/doc/emacs/emacs.texi
+++ b/doc/emacs/emacs.texi
@@ -1285,11 +1285,12 @@ programmer, but if you are not interested in customizing, you can
ignore the customization hints.
This is primarily a reference manual, but can also be used as a
-primer. If you are new to Emacs, we recommend you start with
-the integrated, learn-by-doing tutorial, before reading the manual. To
-run the tutorial, start Emacs and type @kbd{C-h t}. The tutorial
-describes commands, tells you when to try them, and explains the
-results. The tutorial is available in several languages.
+primer. If you are new to Emacs, we recommend you start with the
+integrated, learn-by-doing tutorial, before reading the manual. To
+run the tutorial, start Emacs and type @kbd{C-h t} (which is ``control
+h and then t''). The tutorial describes commands, tells you when to
+try them, and explains the results. The tutorial is available in
+several languages.
On first reading, just skim chapters 1 and 2, which describe the
notational conventions of the manual and the general appearance of the
diff --git a/doc/emacs/fixit.texi b/doc/emacs/fixit.texi
index 6633848716e..db77ae4ec26 100644
--- a/doc/emacs/fixit.texi
+++ b/doc/emacs/fixit.texi
@@ -277,6 +277,10 @@ Check and correct spelling in the region.
@item M-x ispell-message
Check and correct spelling in a draft mail message, excluding cited
material.
+@item M-x ispell-comments-and-strings
+Check and correct spelling of comments and strings in the buffer or region.
+@item M-x ispell-comment-or-string-at-point
+Check the comment or string at point.
@item M-x ispell-change-dictionary @key{RET} @var{dict} @key{RET}
Restart the spell-checker process, using @var{dict} as the dictionary.
@item M-x ispell-kill-ispell
@@ -304,6 +308,8 @@ region; @pxref{Disabled Transient Mark}.)
@findex ispell
@findex ispell-buffer
@findex ispell-region
+@findex ispell-comments-and-strings
+@findex ispell-comment-or-string-at-point
@cindex spell-checking the active region
Similarly, the command @kbd{M-x ispell} performs spell-checking in
the region if one is active, or in the entire buffer otherwise. The
@@ -312,7 +318,10 @@ explicitly perform spell-checking on the entire buffer or the region
respectively. To check spelling in an email message you are writing,
use @w{@kbd{M-x ispell-message}}; that command checks the whole buffer,
except for material that is indented or appears to be cited from other
-messages. @xref{Sending Mail}.
+messages. @xref{Sending Mail}. When dealing with source code, you
+can use @kbd{M-x ispell-comments-and-strings} or @w{@kbd{M-x
+ispell-comment-or-string-at-point}} to check only comments or string
+literals.
When one of these commands encounters what appears to be an
incorrect word, it asks you what to do. It usually displays a list of
diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi
index 9f550b49874..a9b0da5aff6 100644
--- a/doc/emacs/maintaining.texi
+++ b/doc/emacs/maintaining.texi
@@ -1693,6 +1693,12 @@ Start Eshell in the current project's root directory
@item C-x p c
Run compilation in the current project's root directory
(@code{project-compile}).
+@item C-x p !
+Run shell command in the current project's root directory
+(@code{project-shell-command}).
+@item C-x p &
+Run shell command asynchronously in the current project's root
+directory (@code{project-async-shell-command}).
@end table
Emacs provides commands for handling project files conveniently.
@@ -1770,6 +1776,14 @@ directory. @xref{Top,Eshell,Eshell, eshell, Eshell: The Emacs Shell}.
The command @kbd{C-x p c} (@code{project-compile}) runs compilation
(@pxref{Compilation}) in the current project's root directory.
+@findex project-shell-command
+ The command @kbd{C-x p !} (@code{project-shell-command}) runs
+@code{shell-command} in the current project's root directory.
+
+@findex project-async-shell-command
+ The command @kbd{C-x p &} (@code{project-async-shell-command}) runs
+@code{async-shell-command} in the current project's root directory.
+
@node Project Buffer Commands
@subsection Project Commands That Operate on Buffers
diff --git a/doc/lispref/backups.texi b/doc/lispref/backups.texi
index 4ed1a10fcf6..379279575ca 100644
--- a/doc/lispref/backups.texi
+++ b/doc/lispref/backups.texi
@@ -414,10 +414,16 @@ version that the caller should consider deleting now.
@end smallexample
@end defun
-@c Emacs 19 feature
+@defun file-backup-file-names filename
+This function returns a list of all the backup file names for
+@var{filename}, or @code{nil} if there are none. The files are sorted
+by modification time, descending, so that the most recent files are
+first.
+@end defun
+
@defun file-newest-backup filename
-This function returns the name of the most recent backup file for
-@var{filename}, or @code{nil} if that file has no backup files.
+This function returns the first element of the list returned by
+@code{file-backup-file-names}.
Some file comparison commands use this function so that they can
automatically compare a file with its most recent backup.
@@ -460,6 +466,32 @@ Auto Save mode is enabled if @code{buffer-auto-save-file-name} is
non-@code{nil} and @code{buffer-saved-size} (see below) is non-zero.
@end deffn
+@defvar auto-save-file-name-transforms
+This variable lists transforms to apply to buffer's file name before
+making the auto-save file name.
+
+Each transform is a list of the form @w{@code{(@var{regexp}
+@var{replacement} [@var{uniquify}])}}. @var{regexp} is a regular
+expression to match against the file name; if it matches,
+@code{replace-match} is used to replace the matching part with
+@var{replacement}. If the optional element @var{uniquify} is non-nil,
+the auto-save file name is constructed by concatenating the directory
+part of the transformed file name with the buffer's file name in which
+all directory separators were changed to @samp{!} to prevent clashes.
+(This will not work correctly if your filesystem truncates the
+resulting name.)
+
+All the transforms in the list are tried, in the order they are listed.
+When one transform applies, its result is final;
+no further transforms are tried.
+
+The default value is set up to put the auto-save files of remote files
+into the temporary directory (@pxref{Unique File Names}).
+
+On MS-DOS filesystems without long names this variable is always
+ignored.
+@end defvar
+
@defun auto-save-file-name-p filename
This function returns a non-@code{nil} value if @var{filename} is a
string that could be the name of an auto-save file. It assumes
@@ -481,21 +513,6 @@ name. The argument @var{filename} should not contain a directory part.
@result{} nil
@end group
@end example
-
-The standard definition of this function is as follows:
-
-@example
-@group
-(defun auto-save-file-name-p (filename)
- "Return non-nil if FILENAME can be yielded by..."
- (string-match "^#.*#$" filename))
-@end group
-@end example
-
-This function exists so that you can customize it if you wish to
-change the naming convention for auto-save files. If you redefine it,
-be sure to redefine the function @code{make-auto-save-file-name}
-correspondingly.
@end defun
@defun make-auto-save-file-name
@@ -511,31 +528,6 @@ function should check that variable first.
@result{} "/xcssun/users/rms/lewis/#backups.texi#"
@end group
@end example
-
-Here is a simplified version of the standard definition of this
-function:
-
-@example
-@group
-(defun make-auto-save-file-name ()
- "Return file name to use for auto-saves \
-of current buffer.."
- (if buffer-file-name
-@end group
-@group
- (concat
- (file-name-directory buffer-file-name)
- "#"
- (file-name-nondirectory buffer-file-name)
- "#")
- (expand-file-name
- (concat "#%" (buffer-name) "#"))))
-@end group
-@end example
-
-This exists as a separate function so that you can redefine it to
-customize the naming convention for auto-save files. Be sure to
-change @code{auto-save-file-name-p} in a corresponding way.
@end defun
@defopt auto-save-visited-file-name
diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi
index 92cbc2a1c91..090c54f8cd9 100644
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -2438,14 +2438,26 @@ This is for the sake of filesystems that have the concept of a
superroot above the root directory @file{/}. On other filesystems,
@file{/../} is interpreted exactly the same as @file{/}.
+If a filename must be that of a directory, its expansion must be too.
+For example, if a filename ends in @samp{/} or @samp{/.} or @samp{/..}
+then its expansion ends in @samp{/} so that it cannot be
+misinterpreted as the name of a symbolic link:
+
+@example
+@group
+(expand-file-name "/a///b//.")
+ @result{} "/a/b/"
+@end group
+@end example
+
Expanding @file{.} or the empty string returns the default directory:
@example
@group
(expand-file-name "." "/usr/spool/")
- @result{} "/usr/spool"
+ @result{} "/usr/spool/"
(expand-file-name "" "/usr/spool/")
- @result{} "/usr/spool"
+ @result{} "/usr/spool/"
@end group
@end example
diff --git a/doc/lispref/help.texi b/doc/lispref/help.texi
index 9b3c4fcb23d..d4505d5c3ff 100644
--- a/doc/lispref/help.texi
+++ b/doc/lispref/help.texi
@@ -220,7 +220,8 @@ in the *Help* buffer."
@group
;; @r{Display the data.}
- (help-setup-xref (list 'describe-symbols pattern) (interactive-p))
+ (help-setup-xref (list 'describe-symbols pattern)
+ (called-interactively-p 'interactive))
(with-help-window (help-buffer)
(mapcar describe-func (sort sym-list 'string<)))))
@end group
diff --git a/doc/lispref/minibuf.texi b/doc/lispref/minibuf.texi
index 2488fb37529..8b4240c5d80 100644
--- a/doc/lispref/minibuf.texi
+++ b/doc/lispref/minibuf.texi
@@ -411,6 +411,34 @@ following bindings, in addition to those of @code{minibuffer-local-map}:
@end table
@end defvar
+@vindex minibuffer-default-prompt-format
+@defun format-prompt prompt default &rest format-args
+Format @var{prompt} with default value @var{default} according to the
+@code{minibuffer-default-prompt-format} variable.
+
+@code{minibuffer-default-prompt-format} is a format string (defaulting
+to @samp{" (default %s)"} that says how the ``default'' bit in prompts
+like @samp{"Local filename (default somefile): "} are to be formatted.
+
+To allow the users to customize how this is displayed, code that
+prompts the user for a value (and has a default) should look something
+along the lines of this code snippet:
+
+@lisp
+(read-file-name
+ (format-prompt "Local filename" file)
+ nil file)
+@end lisp
+
+If @var{format-args} is @code{nil}, @var{prompt} is used as a literal
+string. If @var{format-args} is non-@code{nil}, @var{prompt} is used
+as a format control string, and @var{prompt} and @var{format-args} are
+passed to @code{format} (@pxref{Formatting Strings}).
+
+@code{minibuffer-default-prompt-format} can be @samp{""}, in which
+case no default values are displayed.
+@end defun
+
@node Object from Minibuffer
@section Reading Lisp Objects with the Minibuffer
@cindex minibuffer input, reading lisp objects
diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index abcd4bbd0f7..94c8c88796f 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -2585,8 +2585,11 @@ implemented this way:
(macroexp-let2* nil ((start from) (end to))
(funcall do `(substring ,getter ,start ,end)
(lambda (v)
- (funcall setter `(cl--set-substring
- ,getter ,start ,end ,v))))))))
+ (macroexp-let2 nil v v
+ `(progn
+ ,(funcall setter `(cl--set-substring
+ ,getter ,start ,end ,v))
+ ,v))))))))
@end example
@end defmac
diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi
index 10bbf8ff09f..adc233d99dd 100644
--- a/doc/misc/cc-mode.texi
+++ b/doc/misc/cc-mode.texi
@@ -1024,9 +1024,7 @@ These key sequences are not bound in AWK Mode, which doesn't have
preprocessor statements.
@item @kbd{M-x c-backward-into-nomenclature}
-@itemx @kbd{M-x c-forward-into-nomenclature}
@findex c-backward-into-nomenclature
-@findex c-forward-into-nomenclature
@findex backward-into-nomenclature @r{(c-)}
@findex forward-into-nomenclature @r{(c-)}
A popular programming style, especially for object-oriented languages
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index 332926a6859..0bdc2fa297d 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -828,6 +828,7 @@ Various
* Spam Package:: A package for filtering and processing spam.
* The Gnus Registry:: A package for tracking messages by Message-ID.
* The Gnus Cloud:: A package for synchronizing Gnus marks.
+* D-Bus Integration:: Closing Gnus servers on system sleep.
* Other modes:: Interaction with other modes.
* Various Various:: Things that are really various.
@@ -22333,6 +22334,7 @@ to you, using @kbd{G b u} and updating the group will usually fix this.
* Spam Package:: A package for filtering and processing spam.
* The Gnus Registry:: A package for tracking messages by Message-ID.
* The Gnus Cloud:: A package for synchronizing Gnus marks.
+* D-Bus Integration:: Closing Gnus servers on system sleep.
* Other modes:: Interaction with other modes.
* Various Various:: Things that are really various.
@end menu
@@ -26404,6 +26406,26 @@ CloudSynchronizationDataPack(TM)s. It's easiest to set this from the
Server buffer (@pxref{Gnus Cloud Setup}).
@end defvar
+@node D-Bus Integration
+@section D-Bus Integration
+@cindex dbus
+@cindex D-Bus
+@cindex gnus-dbus
+@cindex system sleep
+@cindex closing servers automatically
+@cindex hung connections
+
+When using laptops or other systems that have a sleep or hibernate
+functionality, it's possible for long-running server connections to
+become ``hung'', requiring the user to manually close and re-open the
+connections after the system resumes. On systems compiled with D-Bus
+support (check the value of @code{(featurep 'dbusbind)}), Gnus can
+register a D-Bus signal to automatically close all server connections
+before the system goes to sleep. To enable this, set
+@code{gnus-dbus-close-on-sleep} to a non-nil value.
+
+For more information about D-Bus and Emacs, @pxref{Top,,, dbus, D-Bus integration in Emacs}.
+
@node Other modes
@section Interaction with other modes
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index c1a66d02512..bdf3b403d80 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -239,7 +239,7 @@ included in the file name portion, @value{tramp} sends the login name
followed by a newline.
@item
-The remote host may then prompt for a password or pass phrase (for
+The remote host may then prompt for a password or passphrase (for
@command{rsh} or for @command{telnet}). @value{tramp} displays the
password prompt in the minibuffer. @value{tramp} then sends whatever
is entered to the remote host, followed by a newline.
@@ -3563,9 +3563,8 @@ which must be set to a non-@code{nil} value. Example:
Using direct asynchronous processes in @value{tramp} is not possible,
if the remote host is connected via multiple hops
-(@pxref{Multi-hops}), or the @code{make-process} /
-@code{start-file-process} call uses a stderr stream. In this case,
-@value{tramp} falls back to its classical implementation.
+(@pxref{Multi-hops}). In this case, @value{tramp} falls back to its
+classical implementation.
Furthermore, this approach has the following limitations:
@@ -3575,8 +3574,10 @@ It works only for connection methods defined in @file{tramp-sh.el} and
@file{tramp-adb.el}.
@item
-It does not support interactive user authentication, like password
-handling.
+It does not support interactive user authentication. With
+@option{ssh}-based methods, this can be avoided by using a password
+agent like @command{ssh-agent}, using public key authentication, or
+using @code{ControlMaster} options.
@item
It cannot be killed via @code{interrupt-process}.
@@ -3585,6 +3586,9 @@ It cannot be killed via @code{interrupt-process}.
It does not report the remote terminal name via @code{process-tty-name}.
@item
+It does not set process property @code{remote-pid}.
+
+@item
It does not use @code{tramp-remote-path} and
@code{tramp-remote-process-environment}.
diff --git a/etc/NEWS b/etc/NEWS
index d79cbe76111..ad63955f7bf 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -42,6 +42,11 @@ default. We strongly recommend building with HarBuzz support. 'x' is
still a valid backend.
---
+** Building without double buffering support.
+configure --with-xdbe=no can now be used to disable double buffering
+at build time.
+
+---
** 'configure' now warns about building with libXft support.
libXft is unmaintained, and causes a number of problems with modern
fonts including but not limited to crashes; support for it may be
@@ -235,6 +240,14 @@ time zones will use a form like "+0100" instead of "CET".
** Dired
+---
+*** Broken and circular links are shown with the 'dired-broken-symlink' face.
+
+*** '=' ('dired-diff') will now put all backup files into the 'M-n' history.
+When using '=' on a file with backup files, the default file to use
+for diffing is the newest backup file. You can now use 'M-n' to quickly
+select a different backup file instead.
+
+++
*** New user option 'dired-maybe-use-globstar'.
If set, enables globstar (recursive globbing) in shells that support
@@ -291,6 +304,11 @@ tags to be considered as well.
** Gnus
+++
+*** New option 'gnus-dbus-close-on-sleep'
+On systems with D-Bus support, it is now possible to register a signal
+to close all Gnus servers before the system sleeps.
+
++++
*** The key binding of 'gnus-summary-search-article-forward' has changed.
This command was previously on 'M-s' and shadowed the global 'M-s'
search prefix. The command has now been moved to 'M-s M-s'. (For
@@ -371,6 +389,15 @@ take the actual screenshot, and defaults to "ImageMagick import".
The menu-bar Help menu now has a "Show Recent Inputs" item under the
"Describe" sub-menu.
+** Ispell
+
++++
+*** 'ispell-comments-and-strings' now accepts START and END arguments,
+defaulting to active region when used interactively.
+
++++
+*** New command 'ispell-comment-or-string-at-point' is provided.
+
---
** The old non-SMIE indentation of 'sh-mode' has been removed.
@@ -530,6 +557,9 @@ case-insensitive matching of messages when the old behavior is
required, but the recommended solution is to use a correctly matching
regexp instead.
+---
+*** Messages from Visual Studio that mention column numbers are now recognized.
+
** Hi Lock mode
---
@@ -688,6 +718,22 @@ problematic in some contexts (like PDFs), so this list is now filtered
based on 'auto-mode-alist'. Only file names that map to 'image-mode'
are now supported.
+---
+*** The background and foreground of images now default to face colors.
+When an image doesn't specify a foreground or background color, Emacs
+now uses colors from the face used to draw the surrounding text
+instead of the frame's default colors.
+
+To load images with the default frame colors use the ':foreground' and
+':background' image attributes, for example:
+
+ (create-image "filename" nil nil
+ :foreground (face-attribute 'default :foreground)
+ :background (face-attribute 'default :background))
+
+This change only affects image types that support foreground and
+background colors or transparency, such as xbm, pbm, svg, png and gif.
+
** EWW
+++
@@ -736,6 +782,11 @@ This command lets you "switch" to another project and run a project
command chosen from a dispatch menu.
+++
+*** New commands 'project-shell-command' and 'project-async-shell-command'.
+These commands run 'shell-command' and 'async-shell-command' in a
+project's root directory, respectively.
+
++++
*** New user option 'project-list-file'.
** json.el
@@ -851,15 +902,20 @@ window after starting). This variable defaults to nil.
** Miscellaneous
++++
+*** The user can now customize how \"default\" values are prompted for.
+The new utility function 'format-prompt' has been added which uses the
+new 'minibuffer-default-prompt-format' variable to format \"default\"
+prompts. This means that prompts that look like "Enter a number
+(default 10)" can be customized to look like, for instance, "Enter a
+number [10]", or not have the default displayed at all, like "Enter a
+number". (This requires that all callers are altered to user
+'format-prompt', though.)
+
---
*** New 'diff-mode' font locking face 'diff-error'.
This face is used for error messages from diff.
----
-*** 'hs-minor-mode' now heeds 'hs-special-modes-alist' for derived modes.
-The settings in 'hs-special-modes-alist' now also affect modes derived
-from those mentioned in that alist.
-
+++
*** New global mode 'global-goto-address-mode'
This will enable 'goto-address-mode' in all buffers.
@@ -984,6 +1040,11 @@ mode, as are other data files produced by Emacs.
It's a library to create, query, navigate and display hierarchy structures.
+** New themes 'modus-vivendi' and 'modus-operandi'.
+These themes are designed for colour-contrast accessibility. You can
+load the new themes using 'M-x customize-themes' or 'load-theme' from
+your init file.
+
* Incompatible Editing Changes in Emacs 28.1
@@ -1050,33 +1111,40 @@ ledit.el, lmenu.el, lucid.el and old-whitespace.el.
---
** Some functions and variables obsolete since Emacs 23 have been removed:
-
-'GOLD-map', 'bookmark-jump-noselect',
+'GOLD-map', 'advertised-xscheme-send-previous-expression',
+'allout-init', 'bookmark-jump-noselect',
'bookmark-read-annotation-text-func', 'buffer-menu-mode-hook',
-'char-coding-system-table', 'char-valid-p', 'charset-bytes',
-'charset-id', 'charset-list' (function), 'complete-in-turn',
-'completion-common-substring', 'crm-minibuffer-complete',
-'crm-minibuffer-complete-and-exit', 'crm-minibuffer-completion-help',
-'custom-mode', 'custom-mode-hook', 'detect-coding-with-priority',
-'dirtrack-debug' (function), 'dirtrack-debug-toggle',
-'dynamic-completion-table',
+'c-forward-into-nomenclature', 'char-coding-system-table',
+'char-valid-p', 'charset-bytes', 'charset-id', 'charset-list'
+(function), 'choose-completion-delete-max-match', 'complete-in-turn',
+'completion-base-size', 'completion-common-substring',
+'crm-minibuffer-complete', 'crm-minibuffer-complete-and-exit',
+'crm-minibuffer-completion-help', 'custom-mode', 'custom-mode-hook',
+'detect-coding-with-priority', 'dirtrack-debug' (function),
+'dirtrack-debug-toggle', 'dynamic-completion-table',
'easy-menu-precalculate-equivalent-keybindings',
'epa-display-verify-result', 'epg-passphrase-callback-function',
-'eshell-report-bug', 'ffap-bug', 'ffap-submit-bug', 'forward-point',
-'generic-char-p', 'global-highlight-changes', 'hi-lock-face-history',
+'eshell-report-bug', 'eval-next-after-load', 'exchange-dot-and-mark',
+'ffap-bug', 'ffap-submit-bug', 'ffap-version',
+'file-cache-choose-completion', 'forward-point', 'generic-char-p',
+'global-highlight-changes', 'hi-lock-face-history',
'hi-lock-regexp-history', 'highlight-changes-active-string',
'highlight-changes-initial-state', 'highlight-changes-passive-string',
+'image-mode-maybe', 'imenu-example--name-and-position',
'ispell-aspell-supports-utf8', 'lisp-mode-auto-fill',
'locate-file-completion', 'make-coding-system',
-'minibuffer-local-must-match-filename-map', 'mouse-major-mode-menu',
-'mouse-popup-menubar', 'mouse-popup-menubar-stuff',
-'newsticker-groups-filename', 'non-iso-charset-alist',
-'nonascii-insert-offset', 'nonascii-translation-table',
-'password-read-and-add', 'pre-abbrev-expand-hook',
-'process-filter-multibyte-p', 'remember-buffer' (function),
+'minibuffer-local-must-match-filename-map', 'mouse-choose-completion',
+'mouse-major-mode-menu', 'mouse-popup-menubar',
+'mouse-popup-menubar-stuff', 'newsticker-groups-filename',
+'non-iso-charset-alist', 'nonascii-insert-offset',
+'nonascii-translation-table', 'password-read-and-add',
+'pre-abbrev-expand-hook', 'princ-list', 'print-help-return-message',
+'process-filter-multibyte-p', 'read-file-name-predicate',
+'remember-buffer' (function), 'rmail-highlight-face',
'rmail-message-filter', 'set-coding-priority',
-'set-process-filter-multibyte', 'shell-dirtrack-toggle',
-'t-mouse-mode', 'tooltip-hook', 'tpu-have-ispell',
+'set-process-filter-multibyte', 'shadows-compare-text-p',
+'shell-dirtrack-toggle', 't-mouse-mode',
+'term-dynamic-simple-complete', 'tooltip-hook', 'tpu-have-ispell',
'url-generate-unique-filename', 'url-temporary-directory',
'vc-arch-command', 'vc-default-working-revision' (variable),
'vc-mtn-command', 'vc-revert-buffer', 'vc-workfile-version',
@@ -1086,6 +1154,11 @@ ledit.el, lmenu.el, lucid.el and old-whitespace.el.
* Lisp Changes in Emacs 28.1
+++
+*** New function 'file-backup-file-names'.
+This function returns the list of file names of all the backup files
+of its file argument.
+
++++
** The 'count-lines' function now takes an optional parameter to
ignore invisible lines.
@@ -1101,6 +1174,12 @@ This function can be used by modes to add elements to the
'choice' customization type of a variable.
+++
+** 'expand-file-name' no longer omits a trailing slash if the omission
+changes the filename's meaning. E.g., (expand-file-name "/a/b/.") now
+returns "/a/b/" not "/a/b", which might be misinterpreted as the name
+of a symbolic link rather than of the directory it points to.
+
++++
** New function 'file-modes-number-to-symbolic' to convert a numeric
file mode specification into symbolic form.
diff --git a/etc/NEWS.27 b/etc/NEWS.27
index 31b69025173..5ef54309893 100644
--- a/etc/NEWS.27
+++ b/etc/NEWS.27
@@ -24,7 +24,6 @@ applies, and please also update docstrings as needed.
* Installation Changes in Emacs 27.1
----
** Emacs now uses GMP, the GNU Multiple Precision library.
By default, if 'configure' does not find a suitable libgmp, it
arranges for the included mini-gmp library to be built and used.
@@ -58,7 +57,6 @@ that building with Cairo enabled results in using Pango instead of
libXft for font support, and that Pango 1.44 has removed support for
bitmapped fonts.
-+++
** Emacs now uses a "portable dumper" instead of unexec.
This improves compatibility with memory allocation on modern systems,
and in particular better supports the Address Space Layout
diff --git a/etc/PROBLEMS b/etc/PROBLEMS
index f68a183c5d7..67537f6e33b 100644
--- a/etc/PROBLEMS
+++ b/etc/PROBLEMS
@@ -1602,6 +1602,12 @@ even if you should be able to paste, and similar).
You can get back menus on each frame by starting emacs like this:
% env UBUNTU_MENUPROXY= emacs
+*** Mouse click coordinates not recognized correctly on multiple monitors.
+
+This happens on the proprietary X server ASTEC-X when the number of
+monitors is changed after the server has started. A workaround is to
+restart the X server after the monitor configuration has been changed.
+
* Runtime problems on character terminals
** The meta key does not work on xterm.
diff --git a/etc/compilation.txt b/etc/compilation.txt
index 8f7e2906787..11aefc6bc6f 100644
--- a/etc/compilation.txt
+++ b/etc/compilation.txt
@@ -381,6 +381,7 @@ made it more strict about the error message that follows.
keyboard handler.c(537) : warning C4005: 'min' : macro redefinition
d:\tmp\test.c(23) : error C2143: syntax error : missing ';' before 'if'
d:\tmp\test.c(1145) : see declaration of 'nsRefPtr'
+c:\tmp\test.cpp(101,11): error C4101: 'bias0123': unreferenced local variable [c:\tmp\project.vcxproj]
1>test_main.cpp(29): error C2144: syntax error : 'int' should be preceded by ';'
1>test_main.cpp(29): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>
diff --git a/etc/themes/manoj-dark-theme.el b/etc/themes/manoj-dark-theme.el
index 5c76d6a1e98..ac395f993c9 100644
--- a/etc/themes/manoj-dark-theme.el
+++ b/etc/themes/manoj-dark-theme.el
@@ -5,18 +5,20 @@
;; Author: Manoj Srivastava <srivasta@ieee.org>
;; Keywords: lisp, faces
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/etc/themes/modus-operandi-theme.el b/etc/themes/modus-operandi-theme.el
new file mode 100644
index 00000000000..c1090eedefd
--- /dev/null
+++ b/etc/themes/modus-operandi-theme.el
@@ -0,0 +1,4266 @@
+;;; modus-operandi-theme.el --- Accessible light theme (WCAG AAA) -*- lexical-binding:t -*-
+
+;; Copyright (c) 2019-2020 Free Software Foundation, Inc.
+
+;; Author: Protesilaos Stavrou <info@protesilaos.com>
+;; URL: https://gitlab.com/protesilaos/modus-themes
+;; Version: 0.12.0
+;; Package-Requires: ((emacs "26.1"))
+;; Keywords: faces, theme, accessibility
+
+;; This file is part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; This theme is designed for colour-contrast accessibility.
+;;
+;; 1. Provide a consistent minimum contrast ratio between background and
+;; foreground values of 7:1 or higher. This meets the highest such
+;; accessibility criterion per the guidelines of the Worldwide Web
+;; Consortium's Working Group on Accessibility (WCAG AAA standard).
+;;
+;; 2. Offer as close to full face coverage as possible. The list is
+;; already quite long (see further below), with more additions to follow
+;; as part of the ongoing development process.
+;;
+;; The theme provides the following customisation options, all of which
+;; are disabled by default:
+;;
+;; modus-operandi-theme-slanted-constructs (boolean)
+;; modus-operandi-theme-bold-constructs (boolean)
+;; modus-operandi-theme-variable-pitch-headings (boolean)
+;; modus-operandi-theme-rainbow-headings (boolean)
+;; modus-operandi-theme-section-headings (boolean)
+;; modus-operandi-theme-scale-headings (boolean)
+;; modus-operandi-theme-fringes (choice)
+;; modus-operandi-theme-org-blocks (choice)
+;; modus-operandi-theme-prompts (choice)
+;; modus-operandi-theme-3d-modeline (boolean)
+;; modus-operandi-theme-subtle-diffs (boolean)
+;; modus-operandi-theme-faint-syntax (boolean)
+;; modus-operandi-theme-intense-hl-line (boolean)
+;; modus-operandi-theme-intense-paren-match (boolean)
+;; modus-operandi-theme-completions (choice)
+;; modus-operandi-theme-override-colors-alist (alist)
+;;
+;; The default scale is as follows (it can be customised as well):
+;;
+;; modus-operandi-theme-scale-1 1.05
+;; modus-operandi-theme-scale-2 1.1
+;; modus-operandi-theme-scale-3 1.15
+;; modus-operandi-theme-scale-4 1.2
+;; modus-operandi-theme-scale-5 1.3
+;;
+;; What follows is the list of explicitly supported packages or face
+;; groups (there are implicitly supported packages as well, which
+;; inherit from font-lock or some basic group). You are encouraged to
+;; notify me of any missing package or change you would like to see.
+;;
+;; ace-window
+;; ag
+;; alert
+;; all-the-icons
+;; annotate
+;; anzu
+;; apropos
+;; apt-sources-list
+;; artbollocks-mode
+;; auctex and TeX
+;; auto-dim-other-buffers
+;; avy
+;; bm
+;; bongo
+;; boon
+;; breakpoint (provided by built-in gdb-mi.el)
+;; buffer-expose
+;; calendar and diary
+;; calfw
+;; centaur-tabs
+;; change-log and log-view (`vc-print-log' and `vc-print-root-log')
+;; cider
+;; circe
+;; color-rg
+;; column-enforce-mode
+;; company-mode
+;; company-posframe
+;; compilation-mode
+;; completions
+;; counsel
+;; counsel-css
+;; counsel-notmuch
+;; counsel-org-capture-string
+;; cov
+;; csv-mode
+;; ctrlf
+;; custom (M-x customize)
+;; dap-mode
+;; dashboard (emacs-dashboard)
+;; deadgrep
+;; debbugs
+;; define-word
+;; deft
+;; dictionary
+;; diff-hl
+;; diff-mode
+;; dim-autoload
+;; dired
+;; dired-async
+;; dired-git
+;; dired-git-info
+;; dired-narrow
+;; dired-subtree
+;; diredfl
+;; disk-usage
+;; doom-modeline
+;; dynamic-ruler
+;; easy-jekyll
+;; easy-kill
+;; ebdb
+;; ediff
+;; eglot
+;; el-search
+;; eldoc-box
+;; elfeed
+;; elfeed-score
+;; emms
+;; enhanced-ruby-mode
+;; epa
+;; equake
+;; erc
+;; eros
+;; ert
+;; eshell
+;; eshell-fringe-status
+;; eshell-git-prompt
+;; eshell-prompt-extras (epe)
+;; evil (evil-mode)
+;; evil-goggles
+;; evil-visual-mark-mode
+;; eww
+;; eyebrowse
+;; fancy-dabbrev
+;; flycheck
+;; flycheck-indicator
+;; flycheck-posframe
+;; flymake
+;; flyspell
+;; flyspell-correct
+;; flx
+;; freeze-it
+;; frog-menu
+;; focus
+;; fold-this
+;; font-lock (generic syntax highlighting)
+;; forge
+;; fountain (fountain-mode)
+;; geiser
+;; git-commit
+;; git-gutter (and variants)
+;; git-lens
+;; git-rebase
+;; git-timemachine
+;; git-walktree
+;; gnus
+;; golden-ratio-scroll-screen
+;; helm
+;; helm-ls-git
+;; helm-switch-shell
+;; helm-xref
+;; helpful
+;; highlight-blocks
+;; highlight-defined
+;; highlight-escape-sequences (`hes-mode')
+;; highlight-indentation
+;; highlight-numbers
+;; highlight-symbol
+;; highlight-tail
+;; highlight-thing
+;; hl-defined
+;; hl-fill-column
+;; hl-line-mode
+;; hl-todo
+;; hydra
+;; hyperlist
+;; ibuffer
+;; icomplete
+;; ido-mode
+;; iedit
+;; iflipb
+;; imenu-list
+;; indium
+;; info
+;; info-colors
+;; interaction-log
+;; ioccur
+;; isearch, occur, etc.
+;; ivy
+;; ivy-posframe
+;; jira (org-jira)
+;; journalctl-mode
+;; js2-mode
+;; julia
+;; jupyter
+;; kaocha-runner
+;; keycast
+;; line numbers (`display-line-numbers-mode' and global variant)
+;; lsp-mode
+;; lsp-ui
+;; magit
+;; magit-imerge
+;; man
+;; markdown-mode
+;; markup-faces (`adoc-mode')
+;; mentor
+;; messages
+;; minibuffer-line
+;; minimap
+;; modeline
+;; mood-line
+;; mu4e
+;; mu4e-conversation
+;; multiple-cursors
+;; neotree
+;; no-emoji
+;; notmuch
+;; num3-mode
+;; nxml-mode
+;; orderless
+;; org
+;; org-journal
+;; org-noter
+;; org-pomodoro
+;; org-recur
+;; org-roam
+;; org-superstar
+;; org-table-sticky-header
+;; org-treescope
+;; origami
+;; outline-mode
+;; outline-minor-faces
+;; package (M-x list-packages)
+;; page-break-lines
+;; paradox
+;; paren-face
+;; parrot
+;; pass
+;; persp-mode
+;; perspective
+;; phi-grep
+;; phi-search
+;; pkgbuild-mode
+;; pomidor
+;; powerline
+;; powerline-evil
+;; proced
+;; prodigy
+;; rainbow-blocks
+;; rainbow-identifiers
+;; rainbow-delimiters
+;; rcirc
+;; regexp-builder (also known as `re-builder')
+;; rg
+;; ripgrep
+;; rmail
+;; ruler-mode
+;; sallet
+;; selectrum
+;; semantic
+;; sesman
+;; shell-script-mode
+;; show-paren-mode
+;; side-notes
+;; skewer-mode
+;; smart-mode-line
+;; smartparens
+;; smerge
+;; spaceline
+;; speedbar
+;; spell-fu
+;; stripes
+;; suggest
+;; switch-window
+;; swiper
+;; swoop
+;; sx
+;; symbol-overlay
+;; tab-bar-mode
+;; tab-line-mode
+;; syslog-mode
+;; table (built-in table.el)
+;; telephone-line
+;; term
+;; tomatinho
+;; transient (pop-up windows like Magit's)
+;; trashed
+;; treemacs
+;; tty-menu
+;; tuareg
+;; undo-tree
+;; vc (built-in mode line status for version control)
+;; vc-annotate (C-x v g)
+;; vdiff
+;; vimish-fold
+;; visible-mark
+;; visual-regexp
+;; volatile-highlights
+;; vterm
+;; wcheck-mode
+;; web-mode
+;; wgrep
+;; which-function-mode
+;; which-key
+;; whitespace-mode
+;; window-divider-mode
+;; winum
+;; writegood-mode
+;; woman
+;; xah-elisp-mode
+;; xref
+;; xterm-color (and ansi-colors)
+;; yaml-mode
+;; yasnippet
+;; ztree
+
+;;; Code:
+
+
+
+(deftheme modus-operandi
+ "Light theme that conforms with the highest accessibility
+ standard for colour contrast between background and
+ foreground elements (WCAG AAA).")
+
+;;; Custom faces
+
+;; These faces will be inherited by actual constructs. They are meant
+;; for those cases where a face needs to distinguish its output from
+;; the rest of the text, such as `isearch' and `occur'… We define
+;; these separately in order to combine each colour with its
+;; appropriate foreground value. This is to ensure a consistent
+;; contrast ratio of >= 7:1.
+(defgroup modus-theme ()
+ "Theme that ensures WCAG AAA accessibility (contrast ratio
+between foreground and background is >= 7:1)."
+ :group 'faces
+ :prefix "modus-theme-"
+ :link '(url-link :tag "GitLab" "https://gitlab.com/protesilaos/modus-themes")
+ :tag "Modus Operandi")
+
+(defface modus-theme-subtle-red nil nil)
+(defface modus-theme-subtle-green nil nil)
+(defface modus-theme-subtle-yellow nil nil)
+(defface modus-theme-subtle-blue nil nil)
+(defface modus-theme-subtle-magenta nil nil)
+(defface modus-theme-subtle-cyan nil nil)
+(defface modus-theme-subtle-neutral nil nil)
+(defface modus-theme-intense-red nil nil)
+(defface modus-theme-intense-green nil nil)
+(defface modus-theme-intense-yellow nil nil)
+(defface modus-theme-intense-blue nil nil)
+(defface modus-theme-intense-magenta nil nil)
+(defface modus-theme-intense-cyan nil nil)
+(defface modus-theme-intense-neutral nil nil)
+(defface modus-theme-refine-red nil nil)
+(defface modus-theme-refine-green nil nil)
+(defface modus-theme-refine-yellow nil nil)
+(defface modus-theme-refine-blue nil nil)
+(defface modus-theme-refine-magenta nil nil)
+(defface modus-theme-refine-cyan nil nil)
+(defface modus-theme-active-red nil nil)
+(defface modus-theme-active-green nil nil)
+(defface modus-theme-active-yellow nil nil)
+(defface modus-theme-active-blue nil nil)
+(defface modus-theme-active-magenta nil nil)
+(defface modus-theme-active-cyan nil nil)
+(defface modus-theme-fringe-red nil nil)
+(defface modus-theme-fringe-green nil nil)
+(defface modus-theme-fringe-yellow nil nil)
+(defface modus-theme-fringe-blue nil nil)
+(defface modus-theme-fringe-magenta nil nil)
+(defface modus-theme-fringe-cyan nil nil)
+(defface modus-theme-nuanced-red nil nil)
+(defface modus-theme-nuanced-green nil nil)
+(defface modus-theme-nuanced-yellow nil nil)
+(defface modus-theme-nuanced-blue nil nil)
+(defface modus-theme-nuanced-magenta nil nil)
+(defface modus-theme-nuanced-cyan nil nil)
+(defface modus-theme-special-cold nil nil)
+(defface modus-theme-special-mild nil nil)
+(defface modus-theme-special-warm nil nil)
+(defface modus-theme-special-calm nil nil)
+(defface modus-theme-diff-added nil nil)
+(defface modus-theme-diff-changed nil nil)
+(defface modus-theme-diff-removed nil nil)
+(defface modus-theme-diff-refine-added nil nil)
+(defface modus-theme-diff-refine-changed nil nil)
+(defface modus-theme-diff-refine-removed nil nil)
+(defface modus-theme-diff-focus-added nil nil)
+(defface modus-theme-diff-focus-changed nil nil)
+(defface modus-theme-diff-focus-removed nil nil)
+(defface modus-theme-diff-heading nil nil)
+(defface modus-theme-header nil nil) ; Name is tentative
+(defface modus-theme-mark-alt nil nil)
+(defface modus-theme-mark-del nil nil)
+(defface modus-theme-mark-sel nil nil)
+(defface modus-theme-mark-symbol nil nil)
+(defface modus-theme-hl-line nil nil)
+
+;;; Customisation options
+
+;; User-facing customisation options. They are all deactivated by
+;; default (users must opt in).
+(defcustom modus-operandi-theme-slanted-constructs nil
+ "Use slanted text in more code constructs (italics or oblique)."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-bold-constructs nil
+ "Use bold text in more code constructs."
+ :type 'boolean)
+
+(define-obsolete-variable-alias 'modus-operandi-theme-proportional-fonts
+ 'modus-operandi-theme-variable-pitch-headings "`modus-operandi-theme' 0.11.0")
+
+(defcustom modus-operandi-theme-proportional-fonts nil
+ "Use proportional fonts (variable-pitch) in headings."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-variable-pitch-headings nil
+ "Use proportional fonts (variable-pitch) in headings."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-rainbow-headings nil
+ "Use more saturated colours for headings."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-section-headings nil
+ "Use a background and an overline in headings."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-scale-headings nil
+ "Use font scaling for headings."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-scale-1 1.05
+ "Font size that is slightly larger than the base value.
+The default is a floating point that is interpreted as a multiple
+of the base font size. However, the variable also accepts an
+integer, understood as an absolute height (e.g. a value of 140 is
+the same as setting the font at 14 point size).
+
+For more on the matter, read the documentation of
+`set-face-attribute', specifically the ':height' section."
+ :type 'number)
+
+(defcustom modus-operandi-theme-scale-2 1.1
+ "Font size slightly larger than `modus-operandi-theme-scale-1'.
+The default is a floating point that is interpreted as a multiple
+of the base font size. However, the variable also accepts an
+integer, understood as an absolute height (e.g. a value of 140 is
+the same as setting the font at 14 point size).
+
+For more on the matter, read the documentation of
+`set-face-attribute', specifically the ':height' section."
+ :type 'number)
+
+(defcustom modus-operandi-theme-scale-3 1.15
+ "Font size slightly larger than `modus-operandi-theme-scale-2'.
+The default is a floating point that is interpreted as a multiple
+of the base font size. However, the variable also accepts an
+integer, understood as an absolute height (e.g. a value of 140 is
+the same as setting the font at 14 point size).
+
+For more on the matter, read the documentation of
+`set-face-attribute', specifically the ':height' section."
+ :type 'number)
+
+(defcustom modus-operandi-theme-scale-4 1.2
+ "Font size slightly larger than `modus-operandi-theme-scale-3'.
+The default is a floating point that is interpreted as a multiple
+of the base font size. However, the variable also accepts an
+integer, understood as an absolute height (e.g. a value of 140 is
+the same as setting the font at 14 point size).
+
+For more on the matter, read the documentation of
+`set-face-attribute', specifically the ':height' section."
+ :type 'number)
+
+(defcustom modus-operandi-theme-scale-5 1.3
+ "Font size slightly larger than `modus-operandi-theme-scale-4'.
+The default is a floating point that is interpreted as a multiple
+of the base font size. However, the variable also accepts an
+integer, understood as an absolute height (e.g. a value of 140 is
+the same as setting the font at 14 point size).
+
+For more on the matter, read the documentation of
+`set-face-attribute', specifically the ':height' section."
+ :type 'number)
+
+(define-obsolete-variable-alias 'modus-operandi-theme-visible-fringes
+ 'modus-operandi-theme-fringes "`modus-operandi-theme' 0.12.0")
+
+(defcustom modus-operandi-theme-visible-fringes nil
+ "Use a visible style for fringes."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-fringes nil
+ "Define the visibility of fringes.
+
+Nil means the fringes have no background colour. Option `subtle'
+will apply a greyscale value that is visible yet close to the
+main buffer background colour. Option `intense' will use a more
+pronounced greyscale value."
+ :type '(choice
+ (const :tag "No visible fringes (default)" nil)
+ (const :tag "Subtle greyscale background" subtle)
+ (const :tag "Intense greyscale background" intense)))
+
+(define-obsolete-variable-alias 'modus-operandi-theme-distinct-org-blocks
+ 'modus-operandi-theme-org-blocks "`modus-operandi-theme' 0.11.0")
+
+(defcustom modus-operandi-theme-distinct-org-blocks nil
+ "Use a distinct neutral background for `org-mode' blocks."
+ :type 'boolean)
+
+(define-obsolete-variable-alias 'modus-operandi-theme-rainbow-org-src-blocks
+ 'modus-operandi-theme-org-blocks "`modus-operandi-theme' 0.11.0")
+
+(defcustom modus-operandi-theme-rainbow-org-src-blocks nil
+ "Use colour-coded backgrounds for `org-mode' source blocks.
+The colour in use depends on the language (send feedback to
+include more languages)."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-org-blocks nil
+ "Use a subtle grey or colour-coded background for Org blocks.
+
+Nil means that the block will have no background of its own and
+will use the default that applies to the rest of the buffer.
+
+Option `greyscale' will apply a subtle neutral grey background to
+the block's contents. It also affects the begin and end lines of
+the block: their background will be extended to the edge of the
+window for Emacs version >= 27 where the ':extend' keyword is
+recognised by `set-face-attribute'.
+
+Option `rainbow' will use an accented background for the contents
+of the block. The exact colour will depend on the programming
+language and is controlled by the `org-src-block-faces'
+variable (refer to the theme's source code for the current
+association list)."
+ :type '(choice
+ (const :tag "No Org block background (default)" nil)
+ (const :tag "Subtle grey block background" greyscale)
+ (const :tag "Colour-coded background per programming language" rainbow)))
+
+(defcustom modus-operandi-theme-3d-modeline nil
+ "Use a three-dimensional style for the active mode line."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-subtle-diffs nil
+ "Use fewer/dim backgrounds in `diff-mode', `ediff',`magit'."
+ :type 'boolean)
+
+(define-obsolete-variable-alias 'modus-operandi-theme-intense-standard-completions
+ 'modus-operandi-theme-completions "`modus-operandi-theme' 0.12.0")
+
+(defcustom modus-operandi-theme-intense-standard-completions nil
+ "Use prominent backgrounds for Icomplete, Ido, or similar."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-completions nil
+ "Apply special styles to the UI of completion frameworks.
+This concerns Icomplete, Ivy, Helm, Selectrum, Ido, as well as
+any other tool meant to enhance their experience. The effect
+will vary depending on the completion framework.
+
+Nil means to remain faithful to the metaphors that each UI
+establishes. For example, Icomplete and Ido only use foreground
+colours to style their matches, whereas Ivy or Helm rely on an
+aesthetic that combines coloured backgrounds with appropriate
+text colour.
+
+Option `moderate' will apply a combination of background and
+foreground that is fairly subtle. For Icomplete and the like,
+this constitutes a departure from their standard style. While
+Ivy, Helm, and the others, will use less pronounced colours for
+applicable contexts.
+
+Option `opinionated' will apply colour combinations that
+refashion the completion UI. So Icomplete et al will now use
+styles that resemble the defaults of Ivy and co., while the
+latter group will revert to an even more nuanced aesthetic."
+ :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)))
+
+(defcustom modus-operandi-theme-prompts nil
+ "Use subtle or intense styles for minibuffer and REPL prompts.
+
+Nil means to only use an accented foreground colour.
+
+Options `subtle' and `intense' will change both the background
+and the foreground values. The latter has a more pronounced
+effect than the former."
+ :type '(choice
+ (const :tag "No prompt background (default)" nil)
+ (const :tag "Subtle accented background for the prompt" subtle)
+ (const :tag "Intense background and foreground for the prompt" intense)))
+
+(defcustom modus-operandi-theme-intense-hl-line nil
+ "Use more prominent background for `hl-line-mode'."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-intense-paren-match nil
+ "Use more prominent colour for parenthesis matching."
+ :type 'boolean)
+
+(defcustom modus-operandi-theme-faint-syntax nil
+ "Use less saturated colours for code syntax highlighting."
+ :type 'boolean)
+
+;;; Internal functions
+
+;; Helper functions that are meant to ease the implementation of the
+;; above customisation options.
+(defun modus-operandi-theme-bold-weight ()
+ "Conditional use of a heavier text weight."
+ (when modus-operandi-theme-bold-constructs
+ (list :inherit 'bold)))
+
+(defun modus-operandi-theme-fringe (subtlebg intensebg)
+ "Conditional use of background colours for fringes.
+SUBTLEBG should be a subtle greyscale value. INTENSEBG must be a
+more pronounced greyscale colour."
+ (pcase modus-operandi-theme-fringes
+ ('intense (list :background intensebg))
+ ('subtle (list :background subtlebg))
+ (_ (list :background nil))))
+
+(defun modus-operandi-theme-prompt (mainfg subtlebg subtlefg intensebg intensefg)
+ "Conditional use of background colours for prompts.
+MAINFG is the prompt's standard foreground. SUBTLEBG should be a
+subtle accented background that works with SUBTLEFG. INTENSEBG
+must be a more pronounced accented colour that should be
+combinable with INTENSEFG."
+ (pcase modus-operandi-theme-prompts
+ ('intense (list :background intensebg :foreground intensefg))
+ ('subtle (list :background subtlebg :foreground subtlefg))
+ (_ (list :background nil :foreground mainfg))))
+
+(defun modus-operandi-theme-paren (normalbg intensebg)
+ "Conditional use of intense colours for matching parentheses.
+NORMALBG should the special palette colour 'bg-paren-match' or
+something similar. INTENSEBG must be easier to discern next to
+other backgrounds, such as the special palette colour
+'bg-paren-match-intense'."
+ (if modus-operandi-theme-intense-paren-match
+ (list :background intensebg)
+ (list :background normalbg)))
+
+(defun modus-operandi-theme-syntax-foreground (normal faint)
+ "Apply foreground value to code syntax.
+NORMAL is the more saturated colour, which should be the default.
+FAINT is the less saturated colour."
+ (if modus-operandi-theme-faint-syntax
+ (list :foreground faint)
+ (list :foreground normal)))
+
+(defun modus-operandi-theme-heading-foreground (subtle rainbow)
+ "Apply foreground value to headings.
+SUBTLE is the default aesthetic. RAINBOW is the saturated one."
+ (if modus-operandi-theme-rainbow-headings
+ (list :foreground rainbow)
+ (list :foreground subtle)))
+
+(defun modus-operandi-theme-heading-block (bg fg)
+ "Conditionally extend heading styles.
+Apply BG to background and FG to overline."
+ (if modus-operandi-theme-section-headings
+ (append
+ (and (>= emacs-major-version 27) '(:extend t))
+ (list :background bg :overline fg))
+ (list :background nil :overline nil)))
+
+(defun modus-operandi-theme-org-todo-block (bgbox fgbox fg)
+ "Conditionally extend the styles of Org keywords.
+BGBOX applies to the background. FGBOX applies to the foreground
+and the border. FG is used when no block style is in effect."
+ (if modus-operandi-theme-section-headings
+ (list :background bgbox :foreground fgbox :box (list :color fgbox))
+ (list :foreground fg)))
+
+(defun modus-operandi-theme-org-block (bgblk)
+ "Conditionally set the background of Org blocks.
+BGBLK applies to a distinct neutral background. Else blocks have
+no background of their own (the default), so they look the same
+as the rest of the buffer.
+
+`modus-operandi-theme-org-blocks' also accepts a `rainbow' option
+which is applied conditionally to `org-src-block-faces' (see the
+theme's source code)."
+ (if (eq modus-operandi-theme-org-blocks 'greyscale)
+ (append
+ (and (>= emacs-major-version 27) '(:extend t))
+ (list :background bgblk))
+ (list :background nil)))
+
+(defun modus-operandi-theme-org-block-delim (bgaccent fgaccent bg fg)
+ "Conditionally set the styles of Org block delimiters.
+BG, FG, BGACCENT, FGACCENT apply a background and foreground
+colour respectively.
+
+The former pair is a greyscale combination that should be more
+distinct than the background of the block. It is applied to the
+default styles or when `modus-operandi-theme-org-blocks' is set
+to `greyscale'.
+
+The latter pair should be more subtle than the background of the
+block, as it is used when `modus-operandi-theme-org-blocks' is
+set to `rainbow'."
+ (pcase modus-operandi-theme-org-blocks
+ ('greyscale (append (and (>= emacs-major-version 27) '(:extend t))
+ (list :background bg :foreground fg)))
+ ('rainbow (list :background bgaccent :foreground fgaccent))
+ (_ (list :background bg :foreground fg))))
+
+(defun modus-operandi-theme-modeline-box (col3d col &optional btn int)
+ "Control the box properties of the mode line.
+COL3D is the border that is intended for the three-dimensional
+modeline. COL applies to the two-dimensional modeline. Optional
+BTN provides the 3d button style. Optional INT defines a border
+width."
+ (let* ((style (if btn 'released-button nil))
+ (int (if int int 1)))
+ (if modus-operandi-theme-3d-modeline
+ (list :line-width int :color col3d :style style)
+ (list :line-width 1 :color col :style nil))))
+
+(defun modus-operandi-theme-modeline-props (bg3d fg3d &optional bg fg)
+ "Control the background and foreground of the mode line.
+BG is the modeline's background. FG is the modeline's
+foreground. BG3D and FG3D apply to the three-dimensional
+modeline style."
+ (if modus-operandi-theme-3d-modeline
+ (list :background bg3d :foreground fg3d)
+ (list :background bg :foreground fg)))
+
+(defun modus-operandi-theme-diffs (subtle-bg subtle-fg intense-bg intense-fg)
+ "Colour combinations for `modus-operandi-theme-subtle-diffs'.
+
+SUBTLE-BG should be similar or the same as the main background.
+SUBTLE-FG should be an appropriate accent value. INTENSE-BG
+should be one of the dedicated backgrounds for diffs. INTENSE-FG
+should be one of the dedicated foregrounds for diffs"
+ (if modus-operandi-theme-subtle-diffs
+ (list :background subtle-bg :foreground subtle-fg)
+ (list :background intense-bg :foreground intense-fg)))
+
+(defun modus-operandi-theme-standard-completions (mainfg subtlebg intensebg intensefg)
+ "Combinations for `modus-operandi-theme-completions'.
+These are intended for Icomplete, Ido, and related.
+
+MAINFG is an accented foreground value. SUBTLEBG is an accented
+background value that can be combined with MAINFG. INTENSEBG and
+INTENSEFG are accented colours that are designed to be used in
+tandem."
+ (pcase modus-operandi-theme-completions
+ ('opinionated (list :background intensebg :foreground intensefg))
+ ('moderate (list :background subtlebg :foreground mainfg))
+ (_ (list :foreground mainfg))))
+
+(defun modus-operandi-theme-extra-completions (subtleface intenseface altface &optional altfg bold)
+ "Combinations for `modus-operandi-theme-completions'.
+These are intended for Helm, Ivy, Selectrum, etc.
+
+SUBTLEFACE and INTENSEFACE are custom theme faces that combine a
+background and foreground value. The difference between the two
+is a matter of degree.
+
+ALTFACE is a combination of colours that represents a departure
+from the UI's default aesthetics. Optional ALTFG is meant to be
+used in tandem with it.
+
+Optional BOLD will apply a heavier weight to the text."
+ (pcase modus-operandi-theme-completions
+ ('opinionated (list :inherit (list altface bold)
+ :foreground (if altfg altfg 'unspecified)))
+ ('moderate (list :inherit (list subtleface bold)))
+ (_ (list :inherit (list intenseface bold)))))
+
+(defun modus-operandi-theme-scale (amount)
+ "Scale heading by AMOUNT.
+
+AMOUNT is a customisation option."
+ (when modus-operandi-theme-scale-headings
+ (list :height amount)))
+
+;;; Colour palette
+
+;; Define colour palette. Each colour must have a >= 7:1 contrast
+;; ratio relative to the foreground/background colour it is rendered
+;; against.
+;;
+;; The design of the colour palette as a macro that maps it to faces is
+;; adapted from zenbern-theme.el, last seen at commit 7dd7968:
+;; https://github.com/bbatsov/zenburn-emacs
+(eval-and-compile
+ (defconst modus-operandi-theme-default-colors-alist
+ '(;; base values
+ ("bg-main" . "#ffffff") ("fg-main" . "#000000")
+ ("bg-alt" . "#f0f0f0") ("fg-alt" . "#505050")
+ ("bg-dim" . "#f8f8f8") ("fg-dim" . "#282828")
+ ;; specifically for on/off states (e.g. `mode-line')
+ ;;
+ ;; must be combined with themselves
+ ("bg-active" . "#e0e0e0") ("fg-active" . "#191919")
+ ("bg-inactive" . "#efedef") ("fg-inactive" . "#424242")
+ ;; special base values, used only for cases where the above
+ ;; fg-* or bg-* cannot or should not be used (to avoid confusion)
+ ;; must be combined with: {fg,bg}-{main,alt,dim}
+ ("bg-special-cold" . "#dde3f4") ("fg-special-cold" . "#093060")
+ ("bg-special-mild" . "#c4ede0") ("fg-special-mild" . "#184034")
+ ("bg-special-warm" . "#f0e0d4") ("fg-special-warm" . "#5d3026")
+ ("bg-special-calm" . "#f8ddea") ("fg-special-calm" . "#61284f")
+ ;; styles for the main constructs
+ ;;
+ ;; must be combined with: `bg-main', `bg-alt', `bg-dim'
+ ("red" . "#a60000") ("green" . "#005e00")
+ ("yellow" . "#813e00") ("blue" . "#0030a6")
+ ("magenta" . "#721045") ("cyan" . "#00538b")
+ ;; styles for common, but still specialised constructs
+ ;;
+ ;; must be combined with: `bg-main', `bg-alt', `bg-dim'
+ ("red-alt" . "#972500") ("green-alt" . "#315b00")
+ ("yellow-alt" . "#70480f") ("blue-alt" . "#223fbf")
+ ("magenta-alt" . "#8f0075") ("cyan-alt" . "#30517f")
+ ;; same purpose as above, just slight differences
+ ;;
+ ;; must be combined with: `bg-main', `bg-alt', `bg-dim'
+ ("red-alt-other" . "#a0132f") ("green-alt-other" . "#145c33")
+ ("yellow-alt-other" . "#863927") ("blue-alt-other" . "#0000bb")
+ ("magenta-alt-other" . "#5317ac") ("cyan-alt-other" . "#005a5f")
+ ;; styles for desaturated foreground text, intended for use with
+ ;; the `modus-operandi-theme-faint-syntax' option
+ ;;
+ ;; must be combined with: `bg-main', `bg-alt', `bg-dim'
+ ("red-faint" . "#7f1010") ("green-faint" . "#104410")
+ ("yellow-faint" . "#5f4400") ("blue-faint" . "#002f88")
+ ("magenta-faint" . "#752f50") ("cyan-faint" . "#12506f")
+
+ ("red-alt-faint" . "#702f00") ("green-alt-faint" . "#30440f")
+ ("yellow-alt-faint" . "#5d5000") ("blue-alt-faint" . "#003f78")
+ ("magenta-alt-faint" . "#702565") ("cyan-alt-faint" . "#354f6f")
+
+ ("red-alt-other-faint" . "#7f002f") ("green-alt-other-faint" . "#0f443f")
+ ("yellow-alt-other-faint" . "#5e3a20") ("blue-alt-other-faint" . "#1f2f6f")
+ ("magenta-alt-other-faint" . "#5f3f7f") ("cyan-alt-other-faint" . "#2e584f")
+ ;; styles for elements that should be very subtle, yet accented
+ ;;
+ ;; must be combined with: `bg-main', `bg-alt', `bg-dim' or any of
+ ;; the "nuanced" backgrounds
+ ("red-nuanced" . "#5f0000") ("green-nuanced" . "#004000")
+ ("yellow-nuanced" . "#3f3000") ("blue-nuanced" . "#201f55")
+ ("magenta-nuanced" . "#541f4f") ("cyan-nuanced" . "#0f3360")
+ ;; styles for slightly accented background
+ ;;
+ ;; must be combined with any of the above foreground values
+ ("red-nuanced-bg" . "#fff1f0") ("green-nuanced-bg" . "#ecf7ed")
+ ("yellow-nuanced-bg" . "#fff3da") ("blue-nuanced-bg" . "#f3f3ff")
+ ("magenta-nuanced-bg" . "#fdf0ff") ("cyan-nuanced-bg" . "#ebf6fa")
+ ;; styles for elements that should draw attention to themselves
+ ;;
+ ;; must be combined with: `bg-main'
+ ("red-intense" . "#b60000") ("green-intense" . "#006800")
+ ("yellow-intense" . "#904200") ("blue-intense" . "#1111ee")
+ ("magenta-intense" . "#7000e0") ("cyan-intense" . "#205b93")
+ ;; styles for background elements that should be visible yet
+ ;; subtle
+ ;;
+ ;; must be combined with: `fg-dim'
+ ("red-subtle-bg" . "#f2b0a2") ("green-subtle-bg" . "#aecf90")
+ ("yellow-subtle-bg" . "#e4c340") ("blue-subtle-bg" . "#b5d0ff")
+ ("magenta-subtle-bg" . "#f0d3ff") ("cyan-subtle-bg" . "#c0efff")
+ ;; styles for background elements that should be visible and
+ ;; distinguishable
+ ;;
+ ;; must be combined with: `fg-main'
+ ("red-intense-bg" . "#ff8892") ("green-intense-bg" . "#5ada88")
+ ("yellow-intense-bg" . "#f5df23") ("blue-intense-bg" . "#6aaeff")
+ ("magenta-intense-bg" . "#d5baff") ("cyan-intense-bg" . "#42cbd4")
+ ;; styles for refined contexts where both the foreground and the
+ ;; background need to have the same/similar hue
+ ;;
+ ;; must be combined with themselves OR the foregrounds can be
+ ;; combined with any of the base backgrounds
+ ("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")
+ ("magenta-refine-bg" . "#ffccff") ("magenta-refine-fg" . "#770077")
+ ("cyan-refine-bg" . "#8eecf4") ("cyan-refine-fg" . "#004850")
+ ;; styles that are meant exclusively for the mode line
+ ;;
+ ;; must be combined with: `bg-active', `bg-inactive'
+ ("red-active" . "#930000") ("green-active" . "#005300")
+ ("yellow-active" . "#703700") ("blue-active" . "#0033c0")
+ ("magenta-active" . "#6320a0") ("cyan-active" . "#004882")
+ ;; styles that are meant exclusively for the fringes
+ ;;
+ ;; must have a minimum contrast ratio of 1.5:1 with `bg-inactive'
+ ;; and be combined with `fg-main' or `fg-dim'
+ ("red-fringe-bg" . "#ff9a9a") ("green-fringe-bg" . "#86cf86")
+ ("yellow-fringe-bg" . "#e0c050") ("blue-fringe-bg" . "#82afff")
+ ("magenta-fringe-bg" . "#f0a3ff") ("cyan-fringe-bg" . "#00d6e0")
+ ;; styles reserved for specific faces
+ ;;
+ ;; `bg-hl-line' is between `bg-dim' and `bg-alt', so it should
+ ;; work with all accents that cover those two, plus `bg-main'
+ ;;
+ ;; `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 colours
+ ;;
+ ;; `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'
+ ;;
+ ;; `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',
+ ;; though only for styling special elements, such as underlining
+ ;; the current tab
+ ;;
+ ;; `fg-escape-char-construct' and `fg-escape-char-backslash' can
+ ;; be combined `bg-main', `bg-dim', `bg-alt'
+ ;;
+ ;; `fg-lang-error', `fg-lang-warning', `fg-lang-note' can be
+ ;; combined with `bg-main', `bg-dim', `bg-alt'
+ ;;
+ ;; `fg-mark-sel', `fg-mark-del', `fg-mark-alt' can be combined
+ ;; with `bg-main', `bg-dim', `bg-alt', `bg-hl-line'
+ ;;
+ ;; `fg-unfocused' must be combined with `fg-main'
+ ;;
+ ;; the window divider colours apply to faces with just an fg value
+ ;;
+ ;; all pairs are combinable with themselves
+ ("bg-hl-line" . "#f2eff3")
+ ("bg-paren-match" . "#e0af82")
+ ("bg-paren-match-intense" . "#70af9f")
+ ("bg-region" . "#bcbcbc")
+
+ ("bg-tab-bar" . "#d5d5d5")
+ ("bg-tab-active" . "#f6f6f6")
+ ("bg-tab-inactive" . "#bdbdbd")
+ ("fg-tab-active" . "#30169e")
+
+ ("fg-escape-char-construct" . "#8b1030")
+ ("fg-escape-char-backslash" . "#654d0f")
+
+ ("fg-lang-error" . "#9f004f")
+ ("fg-lang-warning" . "#604f0f")
+ ("fg-lang-note" . "#4040ae")
+
+ ("fg-window-divider-inner" . "#888888")
+ ("fg-window-divider-outer" . "#585858")
+
+ ("fg-unfocused" . "#56576d")
+
+ ("bg-header" . "#e5e5e5") ("fg-header" . "#2a2a2a")
+
+ ("bg-whitespace" . "#fff8fc") ("fg-whitespace" . "#645060")
+
+ ("bg-diff-heading" . "#b7c2dd") ("fg-diff-heading" . "#043355")
+ ("bg-diff-added" . "#d4fad4") ("fg-diff-added" . "#004500")
+ ("bg-diff-changed" . "#fcefcf") ("fg-diff-changed" . "#524200")
+ ("bg-diff-removed" . "#ffe8ef") ("fg-diff-removed" . "#691616")
+
+ ("bg-diff-refine-added" . "#94cf94") ("fg-diff-refine-added" . "#002a00")
+ ("bg-diff-refine-changed" . "#cccf8f") ("fg-diff-refine-changed" . "#302010")
+ ("bg-diff-refine-removed" . "#daa2b0") ("fg-diff-refine-removed" . "#400000")
+
+ ("bg-diff-focus-added" . "#bbeabb") ("fg-diff-focus-added" . "#002c00")
+ ("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"))
+ "The entire palette of `modus-operandi-theme'.
+Each element has the form (NAME . HEX).")
+
+ (defcustom modus-operandi-theme-override-colors-alist '()
+ "Association list of palette colour overrides.
+Values can be mapped to variables, using the same syntax as the
+one present in `modus-operandi-theme-default-colors-alist'.
+
+This is only meant for do-it-yourself usage, with the
+understanding that the user is responsible for the resulting
+contrast ratio between new and existing colours."
+ :type '(alist
+ :key-type (string :tag "Name")
+ :value-type (string :tag " Hex")))
+
+ (defmacro modus-operandi-theme-with-color-variables (&rest body)
+ "`let' bind all colours around BODY.
+Also bind `class' to ((class color) (min-colors 89))."
+ (declare (indent 0))
+ `(let ((class '((class color) (min-colors 89)))
+ ,@(mapcar (lambda (cons)
+ (list (intern (car cons)) (cdr cons)))
+ (append modus-operandi-theme-default-colors-alist
+ modus-operandi-theme-override-colors-alist))
+ ;; simple conditional styles that evaluate user-facing
+ ;; customisation options
+ (modus-theme-slant
+ (if modus-operandi-theme-slanted-constructs 'italic 'normal))
+ (modus-theme-variable-pitch
+ (if modus-operandi-theme-variable-pitch-headings 'variable-pitch 'default)))
+ ,@body)))
+
+
+
+;;; Faces
+
+(modus-operandi-theme-with-color-variables
+ (custom-theme-set-faces
+ 'modus-operandi
+;;;; custom faces
+ ;; these bespoke faces are inherited by other constructs below
+;;;;; subtle coloured 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)))
+;;;;; intense coloured 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)))
+;;;;; 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)))
+;;;;; "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)))
+;;;;; nuanced backgrounds
+ ;; useful for adding an accented background that is suitable for all
+ ;; main foreground colours (intended for use in Org source blocks)
+ `(modus-theme-nuanced-red ((,class :background ,red-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(modus-theme-nuanced-green ((,class :background ,green-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(modus-theme-nuanced-yellow ((,class :background ,yellow-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(modus-theme-nuanced-blue ((,class :background ,blue-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(modus-theme-nuanced-magenta ((,class :background ,magenta-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(modus-theme-nuanced-cyan ((,class :background ,cyan-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+;;;;; fringe-specific combinations
+ `(modus-theme-fringe-red ((,class :background ,red-fringe-bg :foreground ,fg-dim)))
+ `(modus-theme-fringe-green ((,class :background ,green-fringe-bg :foreground ,fg-dim)))
+ `(modus-theme-fringe-yellow ((,class :background ,yellow-fringe-bg :foreground ,fg-dim)))
+ `(modus-theme-fringe-blue ((,class :background ,blue-fringe-bg :foreground ,fg-dim)))
+ `(modus-theme-fringe-magenta ((,class :background ,magenta-fringe-bg :foreground ,fg-dim)))
+ `(modus-theme-fringe-cyan ((,class :background ,cyan-fringe-bg :foreground ,fg-dim)))
+;;;;; 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)))
+;;;;; diff-specific combinations
+ ;; intended for `diff-mode' or equivalent
+ `(modus-theme-diff-added ((,class :background ,bg-diff-added :foreground ,fg-diff-added)))
+ `(modus-theme-diff-changed ((,class :background ,bg-diff-changed :foreground ,fg-diff-changed)))
+ `(modus-theme-diff-removed ((,class :background ,bg-diff-removed :foreground ,fg-diff-removed)))
+ `(modus-theme-diff-refine-added ((,class :background ,bg-diff-refine-added :foreground ,fg-diff-refine-added)))
+ `(modus-theme-diff-refine-changed ((,class :background ,bg-diff-refine-changed :foreground ,fg-diff-refine-changed)))
+ `(modus-theme-diff-refine-removed ((,class :background ,bg-diff-refine-removed :foreground ,fg-diff-refine-removed)))
+ `(modus-theme-diff-focus-added ((,class :background ,bg-diff-focus-added :foreground ,fg-diff-focus-added)))
+ `(modus-theme-diff-focus-changed ((,class :background ,bg-diff-focus-changed :foreground ,fg-diff-focus-changed)))
+ `(modus-theme-diff-focus-removed ((,class :background ,bg-diff-focus-removed :foreground ,fg-diff-focus-removed)))
+ `(modus-theme-diff-heading ((,class :background ,bg-diff-heading :foreground ,fg-diff-heading)))
+;;;;; mark indicators
+ ;; colour combinations intended for Dired, Ibuffer, or equivalent
+ `(modus-theme-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)))
+;;;;; other custom faces
+ `(modus-theme-hl-line ((,class :background ,(if modus-operandi-theme-intense-hl-line
+ bg-active bg-hl-line)
+ (and (>= emacs-major-version 27) '(:extend t)))))
+;;;; standard faces
+;;;;; absolute essentials
+ `(default ((,class :background ,bg-main :foreground ,fg-main)))
+ `(cursor ((,class :background ,fg-main)))
+ `(fringe ((,class ,@(modus-operandi-theme-fringe bg-inactive bg-active)
+ :foreground ,fg-main)))
+ `(vertical-border ((,class :foreground ,fg-window-divider-inner)))
+;;;;; basic and/or ungrouped styles
+ ;; Modify the `bold' face to change the weight of all "bold" elements
+ ;; defined by the theme. You need a typeface that supports a
+ ;; multitude of heavier weights than the regular one and then you
+ ;; must specify the exact name of the one you wish to apply. Example
+ ;; for your init.el:
+ ;;
+ ;; (set-face-attribute 'bold nil :weight 'semibold)
+ `(bold ((,class :weight bold)))
+ `(comint-highlight-input ((,class :inherit bold)))
+ `(comint-highlight-prompt ((,class ,@(modus-operandi-theme-bold-weight)
+ ,@(modus-operandi-theme-prompt cyan
+ blue-nuanced-bg
+ blue-alt
+ blue-refine-bg
+ fg-main))))
+ `(error ((,class :inherit bold :foreground ,red)))
+ `(escape-glyph ((,class :foreground ,fg-escape-char-construct)))
+ `(file-name-shadow ((,class :foreground ,fg-unfocused)))
+ `(header-line ((,class :background ,bg-header :foreground ,fg-header)))
+ `(header-line-highlight ((,class :inherit modus-theme-active-blue)))
+ `(homoglyph ((,class :foreground ,fg-escape-char-construct)))
+ `(ibuffer-locked-buffer ((,class :foreground ,yellow-alt-other)))
+ `(italic ((,class :slant italic)))
+ `(nobreak-hyphen ((,class :foreground ,fg-escape-char-construct)))
+ `(nobreak-space ((,class :foreground ,fg-escape-char-construct :underline t)))
+ `(minibuffer-prompt ((,class ,@(modus-operandi-theme-prompt cyan-alt-other
+ cyan-nuanced-bg
+ cyan
+ 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 :background ,bg-region :foreground ,fg-main)))
+ `(secondary-selection ((,class :inherit modus-theme-special-cold)))
+ `(shadow ((,class :foreground ,fg-alt)))
+ `(success ((,class :inherit bold :foreground ,green)))
+ `(trailing-whitespace ((,class :background ,red-intense-bg)))
+ `(warning ((,class :inherit bold :foreground ,yellow)))
+;;;;; buttons, links, widgets
+ `(button ((,class :foreground ,blue-alt-other :underline t)))
+ `(link ((,class :foreground ,blue-alt-other :underline t)))
+ `(link-visited ((,class :foreground ,magenta-alt-other :underline t)))
+ `(tooltip ((,class :background ,bg-special-cold :foreground ,fg-main)))
+ `(widget-button ((,class :inherit button)))
+ `(widget-button-pressed ((,class :inherit button :foreground ,magenta)))
+ `(widget-documentation ((,class :foreground ,green)))
+ `(widget-field ((,class :background ,bg-alt :foreground ,fg-dim)))
+ `(widget-inactive ((,class :background ,bg-inactive :foreground ,fg-inactive)))
+ `(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)))
+;;;;; alert
+ `(alert-high-face ((,class :inherit bold :foreground ,red-alt)))
+ `(alert-low-face ((,class :foreground ,fg-special-mild)))
+ `(alert-moderate-face ((,class :inherit bold :foreground ,yellow)))
+ `(alert-trivial-face ((,class :foreground ,fg-special-calm)))
+ `(alert-urgent-face ((,class :inherit bold :foreground ,red-intense)))
+;;;;; all-the-icons
+ `(all-the-icons-blue ((,class :foreground ,blue)))
+ `(all-the-icons-blue-alt ((,class :foreground ,blue-alt)))
+ `(all-the-icons-cyan ((,class :foreground ,cyan)))
+ `(all-the-icons-cyan-alt ((,class :foreground ,cyan-alt)))
+ `(all-the-icons-dblue ((,class :foreground ,blue-alt-other)))
+ `(all-the-icons-dcyan ((,class :foreground ,cyan-alt-other)))
+ `(all-the-icons-dgreen ((,class :foreground ,green-alt-other)))
+ `(all-the-icons-dired-dir-face ((,class :foreground ,blue)))
+ `(all-the-icons-dmaroon ((,class :foreground ,magenta-alt-other)))
+ `(all-the-icons-dorange ((,class :foreground ,red-alt-other)))
+ `(all-the-icons-dpink ((,class :foreground ,magenta)))
+ `(all-the-icons-dpurple ((,class :foreground ,magenta-alt)))
+ `(all-the-icons-dred ((,class :foreground ,red)))
+ `(all-the-icons-dsilver ((,class :foreground ,fg-special-cold)))
+ `(all-the-icons-dyellow ((,class :foreground ,yellow)))
+ `(all-the-icons-green ((,class :foreground ,green)))
+ `(all-the-icons-lblue ((,class :foreground ,blue-refine-fg)))
+ `(all-the-icons-lcyan ((,class :foreground ,cyan-refine-fg)))
+ `(all-the-icons-lgreen ((,class :foreground ,green-refine-fg)))
+ `(all-the-icons-lmaroon ((,class :foreground ,magenta-refine-fg)))
+ `(all-the-icons-lorange ((,class :foreground ,red-refine-fg)))
+ `(all-the-icons-lpink ((,class :foreground ,magenta-refine-fg)))
+ `(all-the-icons-lpurple ((,class :foreground ,magenta-refine-fg)))
+ `(all-the-icons-lred ((,class :foreground ,red-refine-fg)))
+ `(all-the-icons-lsilver ((,class :foreground ,fg-special-cold)))
+ `(all-the-icons-lyellow ((,class :foreground ,yellow-refine-fg)))
+ `(all-the-icons-maroon ((,class :foreground ,magenta)))
+ `(all-the-icons-orange ((,class :foreground ,red-alt)))
+ `(all-the-icons-pink ((,class :foreground ,magenta)))
+ `(all-the-icons-purple ((,class :foreground ,magenta-alt)))
+ `(all-the-icons-purple-alt ((,class :foreground ,magenta-alt-other)))
+ `(all-the-icons-red ((,class :foreground ,red)))
+ `(all-the-icons-red-alt ((,class :foreground ,red-alt)))
+ `(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-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-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))))
+;;;;; apropos
+ `(apropos-function-button ((,class :foreground ,magenta-alt-other :underline t)))
+ `(apropos-keybinding ((,class :inherit bold :foreground ,cyan)))
+ `(apropos-misc-button ((,class :foreground ,cyan-alt-other :underline t)))
+ `(apropos-property ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,magenta-alt)))
+ `(apropos-symbol ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,blue-nuanced :underline t)))
+ `(apropos-user-option-button ((,class :foreground ,green-alt-other :underline t)))
+ `(apropos-variable-button ((,class :foreground ,blue :underline t)))
+;;;;; apt-sources-list
+ `(apt-sources-list-components ((,class :foreground ,cyan)))
+ `(apt-sources-list-options ((,class :foreground ,yellow)))
+ `(apt-sources-list-suite ((,class :foreground ,green)))
+ `(apt-sources-list-type ((,class :foreground ,magenta)))
+ `(apt-sources-list-uri ((,class :foreground ,blue)))
+;;;;; artbollocks-mode
+ `(artbollocks-face ((,class :foreground ,cyan-nuanced :underline ,fg-lang-note)))
+ `(artbollocks-lexical-illusions-face ((,class :background ,bg-alt :foreground ,red-alt :underline t)))
+ `(artbollocks-passive-voice-face ((,class :foreground ,yellow-nuanced :underline ,fg-lang-warning)))
+ `(artbollocks-weasel-words-face ((,class :foreground ,red-nuanced :underline ,fg-lang-error)))
+;;;;; auctex and Tex
+ `(font-latex-bold-face ((,class :inherit bold :foreground ,fg-special-calm)))
+ `(font-latex-doctex-documentation-face ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(font-latex-doctex-preprocessor-face ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,red-alt-other)))
+ `(font-latex-italic-face ((,class :foreground ,fg-special-calm :slant italic)))
+ `(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)))
+ `(font-latex-sectioning-1-face ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,blue-nuanced)))
+ `(font-latex-sectioning-2-face ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,blue-nuanced)))
+ `(font-latex-sectioning-3-face ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,blue-nuanced)))
+ `(font-latex-sectioning-4-face ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,blue-nuanced)))
+ `(font-latex-sectioning-5-face ((,class :inherit ,modus-theme-variable-pitch :foreground ,blue-nuanced)))
+ `(font-latex-sedate-face ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,magenta-alt-other)))
+ `(font-latex-slide-title-face ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,cyan-nuanced
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4))))
+ `(font-latex-string-face ((,class :foreground ,blue-alt)))
+ `(font-latex-subscript-face ((,class :height 0.95)))
+ `(font-latex-superscript-face ((,class :height 0.95)))
+ `(font-latex-verbatim-face ((,class :background ,bg-dim :foreground ,fg-special-mild)))
+ `(font-latex-warning-face ((,class :foreground ,yellow-alt-other)))
+ `(tex-match ((,class :foreground ,blue-alt-other)))
+ `(tex-verbatim ((,class :background ,bg-dim :foreground ,fg-special-mild)))
+ `(texinfo-heading ((,class :foreground ,magenta)))
+ `(TeX-error-description-error ((,class :inherit bold :foreground ,red)))
+ `(TeX-error-description-help ((,class :foreground ,blue)))
+ `(TeX-error-description-tex-said ((,class :foreground ,blue)))
+ `(TeX-error-description-warning ((,class :inherit bold :foreground ,yellow)))
+;;;;; 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))))
+;;;;; 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 :background ,bg-main :foreground ,red-intense)))
+ `(aw-minibuffer-leading-char-face ((,class :foreground ,magenta-active)))
+ `(aw-mode-line-face ((,class :inherit bold)))
+;;;;; bm
+ `(bm-face ((,class :inherit modus-theme-subtle-yellow
+ ,@(and (>= emacs-major-version 27) '(: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
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+;;;;; bongo
+ `(bongo-album-title ((,class :foreground ,cyan-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-filled-seek-bar ((,class :background ,blue-subtle-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 ,blue-alt-other)))
+ `(bongo-track-title ((,class :foreground ,blue-active)))
+ `(bongo-unfilled-seek-bar ((,class :background ,blue-nuanced-bg :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)))
+;;;;; breakpoint (built-in gdb-mi.el)
+ `(breakpoint-disabled ((,class :foreground ,fg-alt)))
+ `(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)))
+;;;;; calendar and diary
+ `(calendar-month-header ((,class :inherit bold :foreground ,fg-main)))
+ `(calendar-today ((,class :underline t)))
+ `(calendar-weekday-header ((,class :foreground ,fg-dim)))
+ `(calendar-weekend-header ((,class :foreground ,fg-alt)))
+ `(diary ((,class :foreground ,cyan-alt-other)))
+ `(diary-anniversary ((,class :foreground ,red-alt-other)))
+ `(diary-time ((,class :foreground ,blue-alt)))
+ `(holiday ((,class :foreground ,magenta-alt)))
+;;;;; calfw
+ `(cfw:face-annotation ((,class :background ,bg-alt :foreground ,fg-alt)))
+ `(cfw:face-day-title ((,class :background ,bg-alt :foreground ,fg-main)))
+ `(cfw:face-default-content ((,class :foreground ,green-alt)))
+ `(cfw:face-default-day ((,class :inherit (cfw:face-day-title bold))))
+ `(cfw:face-disable ((,class :background ,bg-inactive :foreground ,fg-inactive)))
+ `(cfw:face-grid ((,class :foreground ,fg-inactive)))
+ `(cfw:face-header ((,class :inherit bold ::foreground ,fg-main)))
+ `(cfw:face-holiday ((,class :inherit bold :background ,bg-alt :foreground ,magenta)))
+ `(cfw:face-periods ((,class :foreground ,cyan-alt-other)))
+ `(cfw:face-saturday ((,class :inherit bold :background ,bg-alt :foreground ,magenta-alt)))
+ `(cfw:face-select ((,class :inherit modus-theme-intense-blue)))
+ `(cfw:face-sunday ((,class :inherit bold :background ,bg-alt :foreground ,magenta-alt-other)))
+ `(cfw:face-title ((,class :inherit ,modus-theme-variable-pitch
+ :foreground ,fg-special-warm
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4))))
+ `(cfw:face-today ((,class :inherit bold :foreground ,blue)))
+ `(cfw:face-today-title ((,class :inherit modus-theme-special-mild :box t)))
+ `(cfw:face-toolbar ((,class :background ,bg-active :foreground ,bg-active)))
+ `(cfw:face-toolbar-button-off ((,class :background ,bg-alt :foreground ,cyan)))
+ `(cfw:face-toolbar-button-on ((,class :inherit bold :background ,bg-main :foreground ,blue-intense)))
+;;;;; centaur-tabs
+ `(centaur-tabs-active-bar-face ((,class :background ,fg-tab-active)))
+ `(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)))
+ `(centaur-tabs-modified-marker-selected ((,class :inherit centaur-tabs-selected)))
+ `(centaur-tabs-modified-marker-unselected ((,class :inherit centaur-tabs-unselected)))
+ `(centaur-tabs-default ((,class :background ,bg-main :foreground ,bg-main)))
+ `(centaur-tabs-selected ((,class :inherit bold :background ,bg-tab-active :foreground ,fg-main)))
+ `(centaur-tabs-selected-modified ((,class :background ,bg-tab-active :foreground ,fg-main :slant italic)))
+ `(centaur-tabs-unselected ((,class :background ,bg-tab-inactive :foreground ,fg-dim)))
+ `(centaur-tabs-unselected-modified ((,class :background ,bg-tab-inactive :foreground ,fg-dim :slant italic)))
+;;;;; change-log and log-view (`vc-print-log' and `vc-print-root-log')
+ `(change-log-acknowledgment ((,class :foreground ,fg-alt)))
+ `(change-log-conditionals ((,class :foreground ,magenta-alt)))
+ `(change-log-date ((,class :foreground ,cyan-alt-other)))
+ `(change-log-email ((,class :foreground ,cyan)))
+ `(change-log-file ((,class :foreground ,blue)))
+ `(change-log-function ((,class :foreground ,green-alt-other)))
+ `(change-log-list ((,class :foreground ,magenta-alt-other)))
+ `(change-log-name ((,class :foreground ,cyan)))
+ `(log-edit-header ((,class :inherit bold :foreground ,green-alt-other)))
+ `(log-edit-summary ((,class :foreground ,magenta-alt-other)))
+ `(log-edit-unknown-header ((,class :foreground ,fg-alt)))
+ `(log-view-file ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(log-view-message ((,class :foreground ,fg-alt)))
+;;;;; 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-docview-emphasis-face ((,class :foreground ,fg-special-cold :slant italic)))
+ `(cider-docview-literal-face ((,class :foreground ,blue-alt)))
+ `(cider-docview-strong-face ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(cider-docview-table-border-face ((,class :foreground ,fg-alt)))
+ `(cider-enlightened-face ((,class :box (:line-width -1 :color ,yellow-alt :style nil) :background ,bg-dim)))
+ `(cider-enlightened-local-face ((,class :inherit bold :foreground ,yellow-alt-other)))
+ `(cider-error-highlight-face ((,class :foreground ,red :underline t)))
+ `(cider-fragile-button-face ((,class :box (:line-width 3 :color ,fg-alt :style released-button) :foreground ,yellow)))
+ `(cider-fringe-good-face ((,class :foreground ,green-active)))
+ `(cider-instrumented-face ((,class :box (:line-width -1 :color ,red :style nil) :background ,bg-dim)))
+ `(cider-reader-conditional-face ((,class :foreground ,fg-special-warm :slant italic)))
+ `(cider-repl-input-face ((,class :inherit bold)))
+ `(cider-repl-prompt-face ((,class :foreground ,cyan-alt-other)))
+ `(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)))
+ `(cider-stacktrace-error-class-face ((,class :inherit bold :foreground ,red)))
+ `(cider-stacktrace-error-message-face ((,class :foreground ,red-alt-other :slant italic)))
+ `(cider-stacktrace-face ((,class :foreground ,fg-main)))
+ `(cider-stacktrace-filter-active-face ((,class :foreground ,cyan-alt :underline t)))
+ `(cider-stacktrace-filter-inactive-face ((,class :foreground ,cyan-alt)))
+ `(cider-stacktrace-fn-face ((,class :inherit bold :foreground ,fg-main)))
+ `(cider-stacktrace-ns-face ((,class :foreground ,fg-alt :slant italic)))
+ `(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-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 :foreground ,fg-alt)))
+ `(circe-highlight-nick-face ((,class :inherit bold :foreground ,blue)))
+ `(circe-prompt-face ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(circe-server-face ((,class :foreground ,fg-unfocused)))
+ `(lui-button-face ((,class :foreground ,blue :underline t)))
+ `(lui-highlight-face ((,class :foreground ,magenta-alt)))
+ `(lui-time-stamp-face ((,class :foreground ,blue-nuanced)))
+;;;;; color-rg
+ `(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-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)))
+ `(color-rg-font-lock-header-line-text ((,class :foreground ,fg-active)))
+ `(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-position-splitter ((,class :foreground ,fg-alt)))
+;;;;; column-enforce-mode
+ `(column-enforce-face ((,class :inherit modus-theme-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-scrollbar-bg ((,class :background ,bg-active)))
+ `(company-scrollbar-fg ((,class :background ,fg-active)))
+ `(company-template-field ((,class :inherit modus-theme-intense-magenta)))
+ `(company-tooltip ((,class :background ,bg-alt :foreground ,fg-alt)))
+ `(company-tooltip-annotation ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(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-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 ,@(modus-operandi-theme-bold-weight) :foreground ,red)))
+ `(compilation-info ((,class :foreground ,fg-special-cold)))
+ `(compilation-line-number ((,class :foreground ,fg-special-warm)))
+ `(compilation-mode-line-exit ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,blue-active)))
+ `(compilation-mode-line-fail ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,red-active)))
+ `(compilation-mode-line-run ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,magenta-active)))
+ `(compilation-warning ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,yellow)))
+;;;;; completions
+ `(completions-annotations ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(completions-common-part ((,class ,@(modus-operandi-theme-standard-completions
+ cyan-alt-other cyan-nuanced-bg
+ yellow-refine-bg yellow-refine-fg))))
+ `(completions-first-difference ((,class :inherit bold
+ ,@(modus-operandi-theme-standard-completions
+ blue-alt-other blue-nuanced-bg
+ cyan-subtle-bg fg-dim))))
+;;;;; 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-outline-1 ((,class :inherit outline-1)))
+ `(counsel-outline-2 ((,class :inherit outline-2)))
+ `(counsel-outline-3 ((,class :inherit outline-3)))
+ `(counsel-outline-4 ((,class :inherit outline-4)))
+ `(counsel-outline-5 ((,class :inherit outline-5)))
+ `(counsel-outline-6 ((,class :inherit outline-6)))
+ `(counsel-outline-7 ((,class :inherit outline-7)))
+ `(counsel-outline-8 ((,class :inherit outline-8)))
+ `(counsel-outline-default ((,class :inherit bold :foreground ,green-alt-other)))
+ `(counsel-variable-documentation ((,class :foreground ,yellow-alt-other :slant ,modus-theme-slant)))
+;;;;; counsel-css
+ `(counsel-css-selector-depth-face-1 ((,class :foreground ,blue)))
+ `(counsel-css-selector-depth-face-2 ((,class :foreground ,cyan)))
+ `(counsel-css-selector-depth-face-3 ((,class :foreground ,green)))
+ `(counsel-css-selector-depth-face-4 ((,class :foreground ,yellow)))
+ `(counsel-css-selector-depth-face-5 ((,class :foreground ,magenta)))
+ `(counsel-css-selector-depth-face-6 ((,class :foreground ,red)))
+;;;;; counsel-notmuch
+ `(counsel-notmuch-count-face ((,class :foreground ,cyan)))
+ `(counsel-notmuch-date-face ((,class :foreground ,blue)))
+ `(counsel-notmuch-people-face ((,class :foreground ,magenta)))
+ `(counsel-notmuch-subject-face ((,class :foreground ,magenta-alt-other)))
+;;;;; counsel-org-capture-string
+ `(counsel-org-capture-string-template-body-face ((,class :foreground ,fg-special-cold)))
+;;;;; cov
+ `(cov-coverage-not-run-face ((,class :foreground ,red-intense)))
+ `(cov-coverage-run-face ((,class :foreground ,green-intense)))
+ `(cov-heavy-face ((,class :foreground ,magenta-intense)))
+ `(cov-light-face ((,class :foreground ,blue-intense)))
+ `(cov-med-face ((,class :foreground ,yellow-intense)))
+ `(cov-none-face ((,class :foreground ,cyan-intense)))
+;;;;; 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)))
+;;;;; custom (M-x customize)
+ `(custom-button ((,class :box (:line-width 2 :color nil :style released-button)
+ :background ,bg-active :foreground ,fg-main)))
+ `(custom-button-mouse ((,class :box (:line-width 2 :color nil :style released-button)
+ :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-comment ((,class :foreground ,fg-alt)))
+ `(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-set ((,class :foreground ,blue-alt)))
+ `(custom-state ((,class :foreground ,cyan-alt-other)))
+ `(custom-themed ((,class :inherit modus-theme-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)
+ :background ,bg-active :foreground ,fg-main)))
+ `(dap-result-overlay-face ((,class :box (:line-width -1 :color ,bg-active :style nil)
+ :background ,bg-active :foreground ,fg-main)))
+ `(dap-ui-breakpoint-verified-fringe ((,class :inherit bold :foreground ,green-active)))
+ `(dap-ui-compile-errline ((,class :inherit bold :foreground ,red-intense)))
+ `(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 :foreground ,cyan-alt-other :slant italic)))
+ `(dap-ui-marker-face ((,class :inherit modus-theme-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 :foreground ,fg-alt)))
+;;;;; dashboard (emacs-dashboard)
+ `(dashboard-banner-logo-title ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(dashboard-footer ((,class :inherit bold :foreground ,fg-special-mild)))
+ `(dashboard-heading ((,class :inherit bold :foreground ,fg-special-warm)))
+ `(dashboard-navigator ((,class :foreground ,cyan-alt-other)))
+ `(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-meta-face ((,class :foreground ,fg-alt)))
+ `(deadgrep-regexp-metachar-face ((,class :inherit bold :foreground ,yellow-intense)))
+ `(deadgrep-search-term-face ((,class :inherit bold :foreground ,green-intense)))
+;;;;; debbugs
+ `(debbugs-gnu-archived ((,class :inverse-video t)))
+ `(debbugs-gnu-done ((,class :foreground ,fg-alt)))
+ `(debbugs-gnu-forwarded ((,class :foreground ,fg-special-warm)))
+ `(debbugs-gnu-handled ((,class :foreground ,green)))
+ `(debbugs-gnu-new ((,class :foreground ,red)))
+ `(debbugs-gnu-pending ((,class :foreground ,cyan)))
+ `(debbugs-gnu-stale-1 ((,class :foreground ,yellow-nuanced)))
+ `(debbugs-gnu-stale-2 ((,class :foreground ,yellow)))
+ `(debbugs-gnu-stale-3 ((,class :foreground ,yellow-alt)))
+ `(debbugs-gnu-stale-4 ((,class :foreground ,yellow-alt-other)))
+ `(debbugs-gnu-stale-5 ((,class :foreground ,red-alt)))
+ `(debbugs-gnu-tagged ((,class :foreground ,magenta-alt)))
+;;;;; define-word
+ `(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-face ((,class :foreground ,green-intense)))
+ `(deft-header-face ((,class :inherit bold :foreground ,fg-special-warm)))
+ `(deft-separator-face ((,class :foreground ,fg-alt)))
+ `(deft-summary-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(deft-time-face ((,class :foreground ,fg-special-cold)))
+ `(deft-title-face ((,class :inherit bold :foreground ,fg-main)))
+;;;;; dictionary
+ `(dictionary-button-face ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(dictionary-reference-face ((,class :foreground ,blue-alt-other :underline t)))
+ `(dictionary-word-definition-face ((,class :foreground ,fg-main)))
+ `(dictionary-word-entry-face ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+;;;;; diff-hl
+ `(diff-hl-change ((,class :inherit modus-theme-fringe-yellow)))
+ `(diff-hl-delete ((,class :inherit modus-theme-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-mode
+ `(diff-added ((,class ,@(modus-operandi-theme-diffs
+ bg-main green
+ bg-diff-focus-added fg-diff-focus-added))))
+ `(diff-changed ((,class ,@(modus-operandi-theme-diffs
+ bg-main yellow
+ bg-diff-focus-changed fg-diff-focus-changed))))
+ `(diff-context ((,class :foreground ,fg-unfocused)))
+ `(diff-file-header ((,class :inherit bold :foreground ,blue)))
+ `(diff-function ((,class :foreground ,fg-special-cold)))
+ `(diff-header ((,class :foreground ,blue-nuanced)))
+ `(diff-hunk-header ((,class ,@(modus-operandi-theme-diffs
+ bg-alt blue-alt
+ bg-diff-heading fg-diff-heading))))
+ `(diff-index ((,class :inherit bold :foreground ,blue-alt)))
+ `(diff-indicator-added ((,class :inherit diff-added)))
+ `(diff-indicator-changed ((,class :inherit diff-changed)))
+ `(diff-indicator-removed ((,class :inherit diff-removed)))
+ `(diff-nonexistent ((,class :inherit (modus-theme-neutral bold))))
+ `(diff-refine-added ((,class ,@(modus-operandi-theme-diffs
+ bg-diff-added fg-diff-added
+ bg-diff-refine-added fg-diff-refine-added))))
+ `(diff-refine-changed ((,class ,@(modus-operandi-theme-diffs
+ bg-diff-changed fg-diff-changed
+ bg-diff-refine-changed fg-diff-refine-changed))))
+ `(diff-refine-removed ((,class ,@(modus-operandi-theme-diffs
+ bg-diff-removed fg-diff-removed
+ bg-diff-refine-removed fg-diff-refine-removed))))
+ `(diff-removed ((,class ,@(modus-operandi-theme-diffs
+ bg-main red
+ bg-diff-focus-removed fg-diff-focus-removed))))
+;;;;; dim-autoload
+ `(dim-autoload-cookie-line ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+;;;;; dired
+ `(dired-directory ((,class :foreground ,blue)))
+ `(dired-flagged ((,class :inherit modus-theme-mark-del)))
+ `(dired-header ((,class :inherit modus-theme-header)))
+ `(dired-ignored ((,class :foreground ,fg-alt)))
+ `(dired-mark ((,class :inherit modus-theme-mark-symbol)))
+ `(dired-marked ((,class :inherit modus-theme-mark-sel)))
+ `(dired-perm-write ((,class :foreground ,fg-special-warm)))
+ `(dired-symlink ((,class :foreground ,cyan-alt :underline t)))
+ `(dired-warning ((,class :inherit bold :foreground ,yellow)))
+;;;;; dired-async
+ `(dired-async-failures ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,red-active)))
+ `(dired-async-message ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,green-active)))
+ `(dired-async-mode-message ((,class ,@(modus-operandi-theme-bold-weight) :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-subtree
+ ;; remove background from dired-subtree, else it breaks
+ ;; dired-{flagged,marked} and any other face that sets a background
+ ;; such as hl-line
+ `(dired-subtree-depth-1-face ((,class :background nil)))
+ `(dired-subtree-depth-2-face ((,class :background nil)))
+ `(dired-subtree-depth-3-face ((,class :background nil)))
+ `(dired-subtree-depth-4-face ((,class :background nil)))
+ `(dired-subtree-depth-5-face ((,class :background nil)))
+ `(dired-subtree-depth-6-face ((,class :background nil)))
+;;;;; diredfl
+ `(diredfl-autofile-name ((,class :inherit modus-theme-special-cold)))
+ `(diredfl-compressed-file-name ((,class :foreground ,green-alt-other)))
+ `(diredfl-compressed-file-suffix ((,class :foreground ,green-alt)))
+ `(diredfl-date-time ((,class :foreground ,fg-special-cold)))
+ `(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-header)))
+ `(diredfl-dir-name ((,class :inherit dired-directory)))
+ `(diredfl-dir-priv ((,class :foreground ,blue)))
+ `(diredfl-exec-priv ((,class :foreground ,red-alt-other)))
+ `(diredfl-executable-tag ((,class :foreground ,red-alt)))
+ `(diredfl-file-name ((,class :foreground ,fg-main)))
+ `(diredfl-file-suffix ((,class :foreground ,fg-special-warm)))
+ `(diredfl-flag-mark ((,class :inherit modus-theme-mark-sel)))
+ `(diredfl-flag-mark-line ((,class :inherit modus-theme-mark-sel)))
+ `(diredfl-ignored-file-name ((,class :foreground ,fg-inactive)))
+ `(diredfl-link-priv ((,class :foreground ,blue-alt-other)))
+ `(diredfl-no-priv ((,class :foreground ,fg-inactive)))
+ `(diredfl-number ((,class :foreground ,cyan)))
+ `(diredfl-other-priv ((,class :foreground ,yellow)))
+ `(diredfl-rare-priv ((,class :foreground ,magenta-alt-other)))
+ `(diredfl-read-priv ((,class :foreground ,magenta)))
+ `(diredfl-symlink ((,class :foreground ,cyan-alt :underline t)))
+ `(diredfl-tagged-autofile-name ((,class :inherit modus-theme-refine-magenta)))
+ `(diredfl-write-priv ((,class :foreground ,cyan-alt-other)))
+;;;;; disk-usage
+ `(disk-usage-children ((,class :foreground ,yellow)))
+ `(disk-usage-inaccessible ((,class :inherit bold :foreground ,red)))
+ `(disk-usage-percent ((,class :foreground ,green)))
+ `(disk-usage-size ((,class :foreground ,cyan)))
+ `(disk-usage-symlink ((,class :foreground ,blue :underline t)))
+ `(disk-usage-symlink-directory ((,class :inherit bold :foreground ,blue-alt)))
+;;;;; doom-modeline
+ `(doom-modeline-bar ((,class :inherit modus-theme-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)))
+ `(doom-modeline-battery-error ((,class :inherit modus-theme-active-red)))
+ `(doom-modeline-battery-full ((,class :foreground ,blue-active)))
+ `(doom-modeline-battery-normal ((,class :foreground ,fg-active)))
+ `(doom-modeline-battery-warning ((,class :inherit bold :foreground ,yellow-active)))
+ `(doom-modeline-buffer-file ((,class :inherit bold :foreground ,fg-active)))
+ `(doom-modeline-buffer-major-mode ((,class :inherit bold :foreground ,cyan-active)))
+ `(doom-modeline-buffer-minor-mode ((,class :foreground ,fg-inactive)))
+ `(doom-modeline-buffer-modified ((,class :inherit bold :foreground ,magenta-active)))
+ `(doom-modeline-buffer-path ((,class :inherit bold :foreground ,fg-active)))
+ `(doom-modeline-debug ((,class :inherit bold :foreground ,yellow-active)))
+ `(doom-modeline-debug-visual ((,class :inherit bold :foreground ,red-active)))
+ `(doom-modeline-evil-emacs-state ((,class :inherit bold :foreground ,magenta-active)))
+ `(doom-modeline-evil-insert-state ((,class :inherit bold :foreground ,green-active)))
+ `(doom-modeline-evil-motion-state ((,class :inherit bold :foreground ,fg-inactive)))
+ `(doom-modeline-evil-normal-state ((,class :inherit bold :foreground ,fg-active)))
+ `(doom-modeline-evil-operator-state ((,class :inherit bold :foreground ,blue-active)))
+ `(doom-modeline-evil-replace-state ((,class :inherit bold :foreground ,red-active)))
+ `(doom-modeline-evil-visual-state ((,class :inherit bold :foreground ,cyan-active)))
+ `(doom-modeline-highlight ((,class :inherit bold :foreground ,blue-active)))
+ `(doom-modeline-host ((,class :slant italic)))
+ `(doom-modeline-info ((,class :foreground ,green-active)))
+ `(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-persp-buffer-not-in-persp ((,class :foreground ,yellow-active :slant italic)))
+ `(doom-modeline-persp-name ((,class :foreground ,fg-active)))
+ `(doom-modeline-project-dir ((,class :inherit bold :foreground ,blue-active)))
+ `(doom-modeline-project-parent-dir ((,class :foreground ,blue-active)))
+ `(doom-modeline-project-root-dir ((,class :foreground ,fg-active)))
+ `(doom-modeline-unread-number ((,class :foreground ,fg-active :slant italic)))
+ `(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)))
+;;;;; 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)))
+;;;;; ebdb
+ `(ebdb-address-default ((,class :foreground ,fg-main)))
+ `(ebdb-db-char ((,class :foreground ,fg-special-cold)))
+ `(ebdb-defunct ((,class :foreground ,fg-alt)))
+ `(ebdb-field-hidden ((,class :foreground ,magenta)))
+ `(ebdb-field-url ((,class :foreground ,blue)))
+ `(ebdb-label ((,class :foreground ,cyan-alt-other)))
+ `(ebdb-mail-default ((,class :foreground ,fg-main)))
+ `(ebdb-mail-primary ((,class :foreground ,blue-alt)))
+ `(ebdb-marked ((,class :background ,cyan-intense-bg)))
+ `(ebdb-organization-name ((,class :foreground ,fg-special-calm)))
+ `(ebdb-person-name ((,class :foreground ,magenta-alt-other)))
+ `(ebdb-phone-default ((,class :foreground ,fg-special-warm)))
+ `(ebdb-role-defunct ((,class :foreground ,fg-alt)))
+ `(eieio-custom-slot-tag-face ((,class :foreground ,red-alt)))
+;;;;; ediff
+ `(ediff-current-diff-A ((,class ,@(modus-operandi-theme-diffs
+ bg-alt red
+ bg-diff-removed fg-diff-removed))))
+ `(ediff-current-diff-Ancestor ((,class ,@(modus-operandi-theme-diffs
+ bg-alt fg-special-cold
+ bg-special-cold fg-special-cold))))
+ `(ediff-current-diff-B ((,class ,@(modus-operandi-theme-diffs
+ bg-alt green
+ bg-diff-added fg-diff-added))))
+ `(ediff-current-diff-C ((,class ,@(modus-operandi-theme-diffs
+ bg-alt yellow
+ bg-diff-changed fg-diff-changed))))
+ `(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 ,bg-diff-focus-added :foreground ,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)))
+;;;;; eglot
+ `(eglot-mode-line ((,class ,@(modus-operandi-theme-bold-weight) :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)))
+;;;;; eldoc-box
+ `(eldoc-box-body ((,class :background ,bg-alt :foreground ,fg-main)))
+ `(eldoc-box-border ((,class :background ,fg-alt)))
+;;;;; elfeed
+ `(elfeed-log-date-face ((,class :foreground ,cyan-alt)))
+ `(elfeed-log-debug-level-face ((,class :foreground ,magenta)))
+ `(elfeed-log-error-level-face ((,class :foreground ,red)))
+ `(elfeed-log-info-level-face ((,class :foreground ,green)))
+ `(elfeed-log-warn-level-face ((,class :foreground ,yellow)))
+ `(elfeed-search-date-face ((,class :foreground ,cyan)))
+ `(elfeed-search-feed-face ((,class :foreground ,blue)))
+ `(elfeed-search-filter-face ((,class :foreground ,magenta-active)))
+ `(elfeed-search-last-update-face ((,class :foreground ,green-active)))
+ `(elfeed-search-tag-face ((,class :foreground ,cyan-alt-other)))
+ `(elfeed-search-title-face ((,class :foreground ,fg-main)))
+ `(elfeed-search-unread-count-face ((,class :foreground ,blue-active)))
+ `(elfeed-search-unread-title-face ((,class :inherit bold)))
+;;;;; elfeed-score
+ `(elfeed-score-date-face ((,class :foreground ,blue)))
+ `(elfeed-score-debug-level-face ((,class :foreground ,magenta-alt-other)))
+ `(elfeed-score-error-level-face ((,class :foreground ,red)))
+ `(elfeed-score-info-level-face ((,class :foreground ,cyan)))
+ `(elfeed-score-warn-level-face ((,class :foreground ,yellow)))
+;;;;; 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-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)))
+;;;;; epa
+ `(epa-field-body ((,class :foreground ,fg-main)))
+ `(epa-field-name ((,class :inherit bold :foreground ,fg-dim)))
+ `(epa-mark ((,class :inherit bold :foreground ,magenta)))
+ `(epa-string ((,class :foreground ,blue-alt)))
+ `(epa-validity-disabled ((,class :inherit modus-theme-refine-red)))
+ `(epa-validity-high ((,class :inherit bold :foreground ,green-alt-other)))
+ `(epa-validity-low ((,class :foreground ,fg-alt)))
+ `(epa-validity-medium ((,class :foreground ,green-alt)))
+;;;;; equake
+ `(equake-buffer-face ((,class :background ,bg-main :foreground ,fg-main)))
+ `(equake-shell-type-eshell ((,class :background ,bg-inactive :foreground ,green-active)))
+ `(equake-shell-type-rash ((,class :background ,bg-inactive :foreground ,red-active)))
+ `(equake-shell-type-shell ((,class :background ,bg-inactive :foreground ,cyan-active)))
+ `(equake-shell-type-term ((,class :background ,bg-inactive :foreground ,yellow-active)))
+ `(equake-shell-type-vterm ((,class :background ,bg-inactive :foreground ,magenta-active)))
+ `(equake-tab-active ((,class :background ,fg-alt :foreground ,bg-alt)))
+ `(equake-tab-inactive ((,class :foreground ,fg-inactive)))
+;;;;; erc
+ `(erc-action-face ((,class :inherit bold :foreground ,cyan)))
+ `(erc-bold-face ((,class :inherit bold)))
+ `(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-direct-msg-face ((,class :foreground ,magenta)))
+ `(erc-error-face ((,class :inherit bold :foreground ,red)))
+ `(erc-fool-face ((,class :foreground ,fg-inactive)))
+ `(erc-header-line ((,class :background ,bg-header :foreground ,fg-header)))
+ `(erc-input-face ((,class :foreground ,fg-special-calm)))
+ `(erc-inverse-face ((,class :inherit erc-default-face :inverse-video t)))
+ `(erc-keyword-face ((,class :inherit bold :foreground ,magenta-alt)))
+ `(erc-my-nick-face ((,class :inherit bold :foreground ,magenta)))
+ `(erc-my-nick-prefix-face ((,class :inherit erc-my-nick-face)))
+ `(erc-nick-default-face ((,class :inherit bold :foreground ,blue)))
+ `(erc-nick-msg-face ((,class :inherit bold :foreground ,green)))
+ `(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-timestamp-face ((,class :foreground ,blue-nuanced)))
+ `(erc-underline-face ((,class :underline t)))
+;;;;; eros
+ `(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)))
+;;;;; 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-product ((,class :foreground ,fg-special-warm)))
+ `(eshell-ls-readonly ((,class :foreground ,fg-special-cold)))
+ `(eshell-ls-special ((,class :inherit bold :foreground ,magenta)))
+ `(eshell-ls-symlink ((,class :foreground ,cyan :underline t)))
+ `(eshell-ls-unreadable ((,class :background ,bg-inactive :foreground ,fg-inactive)))
+ `(eshell-prompt ((,class ,@(modus-operandi-theme-bold-weight)
+ ,@(modus-operandi-theme-prompt green-alt-other
+ green-nuanced-bg
+ green-alt
+ green-refine-bg
+ fg-main))))
+;;;;; eshell-fringe-status
+ `(eshell-fringe-status-failure ((,class :foreground ,red)))
+ `(eshell-fringe-status-success ((,class :foreground ,green)))
+;;;;; eshell-git-prompt
+ `(eshell-git-prompt-add-face ((,class :foreground ,fg-alt)))
+ `(eshell-git-prompt-branch-face ((,class :foreground ,fg-alt)))
+ `(eshell-git-prompt-directory-face ((,class :foreground ,cyan)))
+ `(eshell-git-prompt-exit-fail-face ((,class :foreground ,red)))
+ `(eshell-git-prompt-exit-success-face ((,class :foreground ,green)))
+ `(eshell-git-prompt-modified-face ((,class :foreground ,yellow)))
+ `(eshell-git-prompt-powerline-clean-face ((,class :background ,green-refine-bg)))
+ `(eshell-git-prompt-powerline-dir-face ((,class :background ,blue-refine-bg)))
+ `(eshell-git-prompt-powerline-not-clean-face ((,class :background ,magenta-refine-bg)))
+ `(eshell-git-prompt-robyrussell-branch-face ((,class :foreground ,red)))
+ `(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 ,@(modus-operandi-theme-bold-weight) :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 :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(epe-status-face ((,class :foreground ,magenta-alt-other)))
+ `(epe-venv-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+;;;;; 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-goggles
+ `(evil-goggles-change-face ((,class :inherit modus-theme-refine-yellow)))
+ `(evil-goggles-commentary-face ((,class :inherit modus-theme-subtle-neutral :slant ,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-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-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-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-visual-mark-mode
+ `(evil-visual-mark-face ((,class :inherit modus-theme-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)))
+;;;;; 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 :foreground ,fg-alt :underline t)))
+ `(fancy-dabbrev-selection-face ((,class :inherit (modus-theme-intense-cyan bold))))
+;;;;; flycheck
+ `(flycheck-error
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-error :style wave))
+ (,class :foreground ,fg-lang-error :underline t)))
+ `(flycheck-error-list-checker-name ((,class :foreground ,magenta-active)))
+ `(flycheck-error-list-column-number ((,class :foreground ,fg-special-cold)))
+ `(flycheck-error-list-error ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,red)))
+ `(flycheck-error-list-filename ((,class :foreground ,blue)))
+ `(flycheck-error-list-highlight ((,class :inherit modus-theme-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
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-note :style wave))
+ (,class :foreground ,fg-lang-note :underline t)))
+ `(flycheck-verify-select-checker ((,class :box (:line-width 1 :color nil :style released-button))))
+ `(flycheck-warning
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-warning :style wave))
+ (,class :foreground ,fg-lang-warning :underline t)))
+;;;;; flycheck-indicator
+ `(flycheck-indicator-disabled ((,class :foreground ,fg-inactive :slant ,modus-theme-slant)))
+ `(flycheck-indicator-error ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,red-active)))
+ `(flycheck-indicator-info ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,blue-active)))
+ `(flycheck-indicator-running ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,magenta-active)))
+ `(flycheck-indicator-success ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,green-active)))
+ `(flycheck-indicator-warning ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,yellow-active)))
+;;;;; flycheck-posframe
+ `(flycheck-posframe-background-face ((,class :background ,bg-alt)))
+ `(flycheck-posframe-border-face ((,class :foreground ,fg-alt)))
+ `(flycheck-posframe-error-face ((,class :inherit bold :foreground ,red)))
+ `(flycheck-posframe-face ((,class :foreground ,fg-main :slant ,modus-theme-slant)))
+ `(flycheck-posframe-info-face ((,class :inherit bold :foreground ,cyan)))
+ `(flycheck-posframe-warning-face ((,class :inherit bold :foreground ,yellow)))
+;;;;; flymake
+ `(flymake-error
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-error :style wave))
+ (,class :foreground ,fg-lang-error :underline t)))
+ `(flymake-note
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-note :style wave))
+ (,class :foreground ,fg-lang-note :underline t)))
+ `(flymake-warning
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-warning :style wave))
+ (,class :foreground ,fg-lang-warning :underline t)))
+;;;;; flyspell
+ `(flyspell-duplicate
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-warning :style wave))
+ (,class :foreground ,fg-lang-warning :underline t)))
+ `(flyspell-incorrect
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-error :style wave))
+ (,class :foreground ,fg-lang-error :underline t)))
+;;;;; flyspell-correct
+ `(flyspell-correct-highlight-face ((,class :inherit modus-theme-refine-green)))
+;;;;; flx
+ `(flx-highlight-face ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-intense-magenta
+ 'modus-theme-nuanced-magenta
+ magenta-alt-other
+ '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-actions-face ((,class :foreground ,magenta)))
+ `(frog-menu-border ((,class :background ,bg-active)))
+ `(frog-menu-candidates-face ((,class :foreground ,fg-main)))
+ `(frog-menu-posframe-background-face ((,class :background ,bg-dim)))
+ `(frog-menu-prompt-face ((,class :foreground ,cyan)))
+;;;;; focus
+ `(focus-unfocused ((,class :foreground ,fg-unfocused)))
+;;;;; fold-this
+ `(fold-this-overlay ((,class :inherit modus-theme-special-mild)))
+;;;;; font-lock
+ `(font-lock-builtin-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(font-lock-comment-delimiter-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(font-lock-comment-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(font-lock-constant-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(font-lock-doc-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ fg-special-cold cyan-alt-other-faint)
+ :slant ,modus-theme-slant)))
+ `(font-lock-function-name-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(font-lock-keyword-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(font-lock-negation-char-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ yellow yellow-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(font-lock-preprocessor-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ red-alt-other red-alt-other-faint))))
+ `(font-lock-regexp-grouping-backslash ((,class :inherit bold :foreground ,fg-escape-char-backslash)))
+ `(font-lock-regexp-grouping-construct ((,class :inherit bold :foreground ,fg-escape-char-construct)))
+ `(font-lock-string-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue-alt blue-alt-faint))))
+ `(font-lock-type-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint))))
+ `(font-lock-variable-name-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(font-lock-warning-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ yellow-active yellow-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+;;;;; forge
+ `(forge-post-author ((,class :inherit bold :foreground ,fg-main)))
+ `(forge-post-date ((,class :foreground ,fg-special-cold)))
+ `(forge-topic-closed ((,class :foreground ,fg-alt)))
+ `(forge-topic-merged ((,class :foreground ,fg-alt)))
+ `(forge-topic-open ((,class :foreground ,fg-special-mild)))
+ `(forge-topic-unmerged ((,class :foreground ,magenta :slant ,modus-theme-slant)))
+ `(forge-topic-unread ((,class :inherit bold :foreground ,fg-main)))
+;;;;; fountain-mode
+ `(fountain-character ((,class :foreground ,blue-alt-other)))
+ `(fountain-comment ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(fountain-dialog ((,class :foreground ,blue-alt)))
+ `(fountain-metadata-key ((,class :foreground ,green-alt-other)))
+ `(fountain-metadata-value ((,class :foreground ,blue)))
+ `(fountain-non-printing ((,class :foreground ,fg-alt)))
+ `(fountain-note ((,class :foreground ,yellow :slant ,modus-theme-slant)))
+ `(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)))
+ `(fountain-section-heading ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-main
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4))))
+ `(fountain-section-heading-1 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-main
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4))))
+ `(fountain-section-heading-2 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-warm
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-3))))
+ `(fountain-section-heading-3 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-mild
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-2))))
+ `(fountain-section-heading-4 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-calm
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-1))))
+ `(fountain-section-heading-5 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-calm)))
+ `(fountain-synopsis ((,class :foreground ,cyan-alt)))
+ `(fountain-trans ((,class :foreground ,yellow-alt-other)))
+;;;;; geiser
+ `(geiser-font-lock-autodoc-current-arg ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(geiser-font-lock-autodoc-identifier ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue blue-faint))))
+ `(geiser-font-lock-doc-button ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan-alt cyan-alt-faint)
+ :underline t)))
+ `(geiser-font-lock-doc-link ((,class :inherit link)))
+ `(geiser-font-lock-error-link ((,class ,@(modus-operandi-theme-syntax-foreground
+ red-alt red-alt-faint)
+ :underline t)))
+ `(geiser-font-lock-image-button ((,class ,@(modus-operandi-theme-syntax-foreground
+ green-alt green-alt-faint)
+ :underline t)))
+ `(geiser-font-lock-repl-input ((,class :inherit bold)))
+ `(geiser-font-lock-repl-output ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint))))
+ `(geiser-font-lock-repl-prompt ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint))))
+ `(geiser-font-lock-xref-header ((,class :inherit bold)))
+ `(geiser-font-lock-xref-link ((,class :inherit link)))
+;;;;; git-commit
+ `(git-commit-comment-action ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(git-commit-comment-branch-local ((,class :foreground ,blue-alt :slant ,modus-theme-slant)))
+ `(git-commit-comment-branch-remote ((,class :foreground ,magenta-alt :slant ,modus-theme-slant)))
+ `(git-commit-comment-detached ((,class :foreground ,cyan-alt :slant ,modus-theme-slant)))
+ `(git-commit-comment-file ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(git-commit-comment-heading ((,class :inherit bold :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(git-commit-keyword ((,class :foreground ,magenta)))
+ `(git-commit-known-pseudo-header ((,class :inherit bold :foreground ,fg-special-warm)))
+ `(git-commit-nonempty-second-line ((,class :inherit modus-theme-refine-yellow)))
+ `(git-commit-overlong-summary ((,class :inherit modus-theme-refine-yellow)))
+ `(git-commit-pseudo-header ((,class :inherit bold :foreground ,fg-alt)))
+ `(git-commit-summary ((,class :foreground ,magenta-alt-other)))
+;;;;; git-rebase
+ `(git-rebase-comment-hash ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(git-rebase-comment-heading ((,class :inherit bold :foreground ,fg-dim :slant ,modus-theme-slant)))
+ `(git-rebase-description ((,class :foreground ,fg-main)))
+ `(git-rebase-hash ((,class :foreground ,cyan-alt-other)))
+;;;;; 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-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,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-lens
+ `(git-lens-added ((,class :inherit bold :foreground ,green)))
+ `(git-lens-deleted ((,class :inherit bold :foreground ,red)))
+ `(git-lens-header ((,class :inherit bold :height 1.1 :foreground ,cyan)))
+ `(git-lens-modified ((,class :inherit bold :foreground ,yellow)))
+ `(git-lens-renamed ((,class :inherit bold :foreground ,magenta)))
+;;;;; git-timemachine
+ `(git-timemachine-commit ((,class :inherit bold :foreground ,yellow-active)))
+ `(git-timemachine-minibuffer-author-face ((,class :foreground ,fg-special-warm)))
+ `(git-timemachine-minibuffer-detail-face ((,class :foreground ,red-alt)))
+;;;;; git-walktree
+ `(git-walktree-commit-face ((,class :foreground ,yellow)))
+ `(git-walktree-symlink-face ((,class :foreground ,cyan :underline t)))
+ `(git-walktree-tree-face ((,class :foreground ,magenta)))
+;;;;; gnus
+ `(gnus-button ((,class :inherit button)))
+ `(gnus-cite-1 ((,class :foreground ,blue-alt)))
+ `(gnus-cite-10 ((,class :foreground ,magenta-alt-other)))
+ `(gnus-cite-11 ((,class :foreground ,yellow-alt-other)))
+ `(gnus-cite-2 ((,class :foreground ,red-alt)))
+ `(gnus-cite-3 ((,class :foreground ,green-alt)))
+ `(gnus-cite-4 ((,class :foreground ,magenta-alt)))
+ `(gnus-cite-5 ((,class :foreground ,yellow-alt)))
+ `(gnus-cite-6 ((,class :foreground ,cyan-alt)))
+ `(gnus-cite-7 ((,class :foreground ,blue-alt-other)))
+ `(gnus-cite-8 ((,class :foreground ,red-alt-other)))
+ `(gnus-cite-9 ((,class :foreground ,green-alt-other)))
+ `(gnus-cite-attribution ((,class :foreground ,fg-main :slant italic)))
+ `(gnus-emphasis-highlight-words ((,class :inherit modus-theme-refine-yellow)))
+ `(gnus-group-mail-1 ((,class :inherit bold :foreground ,magenta-alt)))
+ `(gnus-group-mail-1-empty ((,class :foreground ,magenta-alt)))
+ `(gnus-group-mail-2 ((,class :inherit bold :foreground ,magenta)))
+ `(gnus-group-mail-2-empty ((,class :foreground ,magenta)))
+ `(gnus-group-mail-3 ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(gnus-group-mail-3-empty ((,class :foreground ,magenta-alt-other)))
+ `(gnus-group-mail-low ((,class :inherit bold :foreground ,magenta-nuanced)))
+ `(gnus-group-mail-low-empty ((,class :foreground ,magenta-nuanced)))
+ `(gnus-group-news-1 ((,class :inherit bold :foreground ,green)))
+ `(gnus-group-news-1-empty ((,class :foreground ,green)))
+ `(gnus-group-news-2 ((,class :inherit bold :foreground ,cyan)))
+ `(gnus-group-news-2-empty ((,class :foreground ,cyan)))
+ `(gnus-group-news-3 ((,class :inherit bold :foreground ,yellow-nuanced)))
+ `(gnus-group-news-3-empty ((,class :foreground ,yellow-nuanced)))
+ `(gnus-group-news-4 ((,class :inherit bold :foreground ,cyan-nuanced)))
+ `(gnus-group-news-4-empty ((,class :foreground ,cyan-nuanced)))
+ `(gnus-group-news-5 ((,class :inherit bold :foreground ,red-nuanced)))
+ `(gnus-group-news-5-empty ((,class :foreground ,red-nuanced)))
+ `(gnus-group-news-6 ((,class :inherit bold :foreground ,fg-alt)))
+ `(gnus-group-news-6-empty ((,class :foreground ,fg-alt)))
+ `(gnus-group-news-low ((,class :inherit bold :foreground ,green-nuanced)))
+ `(gnus-group-news-low-empty ((,class :foreground ,green-nuanced)))
+ `(gnus-header-content ((,class :foreground ,fg-special-calm)))
+ `(gnus-header-from ((,class :inherit bold :foreground ,cyan-alt :underline nil)))
+ `(gnus-header-name ((,class :foreground ,cyan-alt-other)))
+ `(gnus-header-newsgroups ((,class :inherit bold :foreground ,blue-alt)))
+ `(gnus-header-subject ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(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-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 :foreground ,fg-special-cold :slant italic)))
+ `(gnus-splash ((,class :foreground ,fg-alt)))
+ `(gnus-summary-cancelled ((,class :inherit modus-theme-mark-alt)))
+ `(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)))
+ `(gnus-summary-high-undownloaded ((,class :inherit bold :foreground ,yellow)))
+ `(gnus-summary-high-unread ((,class :inherit bold :foreground ,fg-main)))
+ `(gnus-summary-low-ancient ((,class :foreground ,fg-alt :slant italic)))
+ `(gnus-summary-low-read ((,class :foreground ,fg-special-cold :slant italic)))
+ `(gnus-summary-low-ticked ((,class :foreground ,red-refine-fg :slant italic)))
+ `(gnus-summary-low-undownloaded ((,class :foreground ,yellow-refine-fg :slant italic)))
+ `(gnus-summary-low-unread ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(gnus-summary-normal-ancient ((,class :foreground ,fg-special-calm)))
+ `(gnus-summary-normal-read ((,class :foreground ,fg-special-cold)))
+ `(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)))
+;;;;; 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-action ((,class :underline t)))
+ `(helm-bookmark-addressbook ((,class :foreground ,green-alt)))
+ `(helm-bookmark-directory ((,class :inherit bold :foreground ,blue)))
+ `(helm-bookmark-file ((,class :foreground ,fg-main)))
+ `(helm-bookmark-file-not-found ((,class :background ,bg-alt :foreground ,fg-alt)))
+ `(helm-bookmark-gnus ((,class :foreground ,magenta)))
+ `(helm-bookmark-info ((,class :foreground ,cyan-alt)))
+ `(helm-bookmark-man ((,class :foreground ,yellow-alt)))
+ `(helm-bookmark-w3m ((,class :foreground ,blue-alt)))
+ `(helm-buffer-archive ((,class :inherit bold :foreground ,cyan)))
+ `(helm-buffer-directory ((,class :inherit bold :foreground ,blue)))
+ `(helm-buffer-file ((,class :foreground ,fg-main)))
+ `(helm-buffer-modified ((,class :foreground ,yellow-alt)))
+ `(helm-buffer-not-saved ((,class :foreground ,red-alt)))
+ `(helm-buffer-process ((,class :foreground ,magenta)))
+ `(helm-buffer-saved-out ((,class :inherit bold :background ,bg-alt :foreground ,red)))
+ `(helm-buffer-size ((,class :foreground ,fg-alt)))
+ `(helm-candidate-number ((,class :foreground ,cyan-active)))
+ `(helm-candidate-number-suspended ((,class :foreground ,yellow-active)))
+ `(helm-comint-prompts-buffer-name ((,class :foreground ,green-active)))
+ `(helm-comint-prompts-promptidx ((,class :foreground ,cyan-active)))
+ `(helm-delete-async-message ((,class :inherit bold :foreground ,magenta-active)))
+ `(helm-eob-line ((,class :background ,bg-main :foreground ,fg-main)))
+ `(helm-eshell-prompts-buffer-name ((,class :foreground ,green-active)))
+ `(helm-eshell-prompts-promptidx ((,class :foreground ,cyan-active)))
+ `(helm-etags-file ((,class :foreground ,fg-dim :underline t)))
+ `(helm-ff-backup-file ((,class :foreground ,fg-alt)))
+ `(helm-ff-denied ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-red
+ 'modus-theme-intense-red
+ 'modus-theme-nuanced-red
+ red))))
+ `(helm-ff-directory ((,class :inherit helm-buffer-directory)))
+ `(helm-ff-dirs ((,class :inherit bold :foreground ,blue-alt-other)))
+ `(helm-ff-dotted-directory ((,class :inherit bold :background ,bg-alt :foreground ,fg-alt)))
+ `(helm-ff-dotted-symlink-directory ((,class :inherit helm-ff-dotted-directory :underline t)))
+ `(helm-ff-executable ((,class :foreground ,magenta-alt)))
+ `(helm-ff-file ((,class :foreground ,fg-main)))
+ `(helm-ff-file-extension ((,class :foreground ,fg-special-warm)))
+ `(helm-ff-invalid-symlink ((,class :foreground ,red :underline t)))
+ `(helm-ff-pipe ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-refine-magenta
+ 'modus-theme-subtle-magenta
+ 'modus-theme-nuanced-magenta
+ magenta))))
+ `(helm-ff-prefix ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-refine-yellow
+ 'modus-theme-subtle-yellow
+ 'modus-theme-nuanced-yellow
+ yellow-alt-other))))
+ `(helm-ff-socket ((,class :foreground ,red-alt-other)))
+ `(helm-ff-suid ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-red
+ 'modus-theme-refine-red
+ 'modus-theme-nuanced-yellow
+ red-alt))))
+ `(helm-ff-symlink ((,class :foreground ,cyan :underline t)))
+ `(helm-ff-truename ((,class :foreground ,blue-alt-other)))
+ `(helm-grep-cmd-line ((,class :foreground ,yellow-alt-other)))
+ `(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-header ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(helm-header-line-left-margin ((,class :inherit bold :foreground ,yellow-intense)))
+ `(helm-history-deleted ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-red
+ 'modus-theme-intense-red
+ 'modus-theme-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-operandi-theme-extra-completions
+ 'modus-theme-subtle-yellow
+ 'modus-theme-refine-yellow
+ 'modus-theme-nuanced-yellow
+ yellow
+ 'bold))))
+ `(helm-locate-finish ((,class :foreground ,green-active)))
+ `(helm-match ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-cyan
+ 'modus-theme-refine-cyan
+ 'modus-theme-nuanced-cyan
+ cyan
+ 'bold))))
+ `(helm-match-item ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-neutral
+ 'modus-theme-subtle-cyan
+ 'modus-theme-nuanced-cyan
+ cyan-alt-other))))
+ `(helm-minibuffer-prompt ((,class :inherit minibuffer-prompt)))
+ `(helm-moccur-buffer ((,class :foreground ,cyan-alt-other :underline t)))
+ `(helm-mode-prefix ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-intense-magenta
+ 'modus-theme-nuanced-magenta
+ magenta-alt
+ 'bold))))
+ `(helm-non-file-buffer ((,class :foreground ,fg-alt)))
+ `(helm-prefarg ((,class :foreground ,red-active)))
+ `(helm-resume-need-update ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-refine-magenta
+ 'modus-theme-nuanced-magenta
+ magenta-alt-other))))
+ `(helm-selection ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-blue
+ 'modus-theme-refine-blue
+ 'modus-theme-special-cold
+ nil
+ 'bold))))
+ `(helm-selection-line ((,class :inherit modus-theme-special-cold)))
+ `(helm-separator ((,class :foreground ,fg-special-mild)))
+ `(helm-time-zone-current ((,class :foreground ,green)))
+ `(helm-time-zone-home ((,class :foreground ,magenta)))
+ `(helm-source-header ((,class :inherit bold :foreground ,red-alt
+ ,@(modus-operandi-theme-scale modus-operandi-theme-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-ls-git
+ `(helm-ls-git-added-copied-face ((,class :foreground ,green-intense)))
+ `(helm-ls-git-added-modified-face ((,class :foreground ,yellow-intense)))
+ `(helm-ls-git-conflict-face ((,class :inherit bold :foreground ,red-intense)))
+ `(helm-ls-git-deleted-and-staged-face ((,class :foreground ,red-nuanced)))
+ `(helm-ls-git-deleted-not-staged-face ((,class :foreground ,red)))
+ `(helm-ls-git-modified-and-staged-face ((,class :foreground ,yellow-nuanced)))
+ `(helm-ls-git-modified-not-staged-face ((,class :foreground ,yellow)))
+ `(helm-ls-git-renamed-modified-face ((,class :foreground ,magenta)))
+ `(helm-ls-git-untracked-face ((,class :foreground ,fg-special-cold)))
+;;;;; helm-switch-shell
+ `(helm-switch-shell-new-shell-face ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-refine-magenta
+ 'modus-theme-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 (bold ,modus-theme-variable-pitch) :foreground ,fg-main
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4))))
+;;;;; highlight region or ad-hoc regexp
+ `(hi-black-b ((,class :background ,fg-main :foreground ,bg-main)))
+ `(hi-blue ((,class :background ,bg-alt :foreground ,blue :underline t)))
+ `(hi-blue-b ((,class :inherit modus-theme-intense-blue)))
+ `(hi-green ((,class :background ,bg-alt :foreground ,green :underline t)))
+ `(hi-green-b ((,class :inherit modus-theme-intense-green)))
+ `(hi-pink ((,class :background ,bg-alt :foreground ,magenta :underline t)))
+ `(hi-red-b ((,class :inherit modus-theme-intense-red)))
+ `(hi-yellow ((,class :background ,bg-alt :foreground ,yellow :underline t)))
+ `(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-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)))
+ `(highlight-blocks-depth-3-face ((,class :background ,bg-special-cold :foreground ,fg-main)))
+ `(highlight-blocks-depth-4-face ((,class :background ,bg-special-calm :foreground ,fg-main)))
+ `(highlight-blocks-depth-5-face ((,class :background ,bg-special-warm :foreground ,fg-main)))
+ `(highlight-blocks-depth-6-face ((,class :background ,bg-special-mild :foreground ,fg-main)))
+ `(highlight-blocks-depth-7-face ((,class :background ,bg-inactive :foreground ,fg-main)))
+ `(highlight-blocks-depth-8-face ((,class :background ,bg-active :foreground ,fg-main)))
+ `(highlight-blocks-depth-9-face ((,class :background ,cyan-subtle-bg :foreground ,fg-main)))
+;;;;; highlight-defined
+ `(highlight-defined-builtin-function-name-face ((,class :foreground ,magenta)))
+ `(highlight-defined-face-name-face ((,class :foreground ,fg-main)))
+ `(highlight-defined-function-name-face ((,class :foreground ,magenta)))
+ `(highlight-defined-macro-name-face ((,class :foreground ,magenta-alt)))
+ `(highlight-defined-special-form-name-face ((,class :foreground ,magenta-alt-other)))
+ `(highlight-defined-variable-name-face ((,class :foreground ,cyan)))
+;;;;; highlight-escape-sequences (`hes-mode')
+ `(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-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-thing
+ `(highlight-thing ((,class :background ,bg-alt :foreground ,cyan)))
+;;;;; hl-defined
+ `(hdefd-functions ((,class :foreground ,blue)))
+ `(hdefd-undefined ((,class :foreground ,red-alt)))
+ `(hdefd-variables ((,class :foreground ,cyan-alt)))
+;;;;; hl-fill-column
+ `(hl-fill-column-face ((,class :background ,bg-active :foreground ,fg-active)))
+;;;;; hl-todo
+ `(hl-todo ((,class :inherit bold :foreground ,red-alt-other :slant ,modus-theme-slant)))
+;;;;; hydra
+ `(hydra-face-amaranth ((,class :inherit bold :foreground ,yellow)))
+ `(hydra-face-blue ((,class :inherit bold :foreground ,blue-alt)))
+ `(hydra-face-pink ((,class :inherit bold :foreground ,magenta-alt)))
+ `(hydra-face-red ((,class :inherit bold :foreground ,red)))
+ `(hydra-face-teal ((,class :inherit bold :foreground ,cyan)))
+;;;;; hyperlist
+ `(hyperlist-condition ((,class :foreground ,green)))
+ `(hyperlist-hashtag ((,class :foreground ,yellow)))
+ `(hyperlist-operator ((,class :foreground ,blue-alt)))
+ `(hyperlist-paren ((,class :foreground ,cyan-alt-other)))
+ `(hyperlist-quote ((,class :foreground ,cyan-alt)))
+ `(hyperlist-ref ((,class :foreground ,magenta-alt-other)))
+ `(hyperlist-stars ((,class :foreground ,fg-alt)))
+ `(hyperlist-tag ((,class :foreground ,red)))
+ `(hyperlist-toplevel ((,class :inherit bold :foreground ,fg-main)))
+;;;;; icomplete
+ `(icomplete-first-match ((,class :inherit bold
+ ,@(modus-operandi-theme-standard-completions
+ magenta magenta-nuanced-bg
+ magenta-intense-bg fg-main))))
+;;;;; icomplete-vertical
+ `(icomplete-vertical-separator ((,class :foreground ,fg-alt)))
+;;;;; ido-mode
+ `(ido-first-match ((,class :inherit bold
+ ,@(modus-operandi-theme-standard-completions
+ magenta magenta-nuanced-bg
+ magenta-subtle-bg fg-main))))
+ `(ido-incomplete-regexp ((,class :inherit error)))
+ `(ido-indicator ((,class :inherit modus-theme-subtle-yellow)))
+ `(ido-only-match ((,class :inherit bold
+ ,@(modus-operandi-theme-standard-completions
+ magenta-intense red-nuanced-bg
+ magenta-intense-bg fg-main))))
+ `(ido-subdir ((,class :foreground ,blue-alt-other)))
+ `(ido-virtual ((,class :foreground ,yellow-alt-other)))
+;;;;; iedit
+ `(iedit-occurrence ((,class :inherit modus-theme-refine-blue)))
+ `(iedit-read-only-occurrence ((,class :inherit modus-theme-intense-yellow)))
+;;;;; iflipb
+ `(iflipb-current-buffer-face ((,class :inherit bold :foreground ,cyan-alt)))
+ `(iflipb-other-buffer-face ((,class :foreground ,fg-alt)))
+;;;;; imenu-list
+ `(imenu-list-entry-face-0 ((,class :foreground ,cyan)))
+ `(imenu-list-entry-face-1 ((,class :foreground ,blue)))
+ `(imenu-list-entry-face-2 ((,class :foreground ,cyan-alt-other)))
+ `(imenu-list-entry-face-3 ((,class :foreground ,blue-alt)))
+ `(imenu-list-entry-subalist-face-0 ((,class :inherit bold :foreground ,magenta-alt-other :underline t)))
+ `(imenu-list-entry-subalist-face-1 ((,class :inherit bold :foreground ,magenta :underline t)))
+ `(imenu-list-entry-subalist-face-2 ((,class :inherit bold :foreground ,green-alt-other :underline t)))
+ `(imenu-list-entry-subalist-face-3 ((,class :inherit bold :foreground ,red-alt-other :underline t)))
+;;;;; indium
+ `(indium-breakpoint-face ((,class :foreground ,red-active)))
+ `(indium-frame-url-face ((,class :foreground ,fg-alt :underline t)))
+ `(indium-keyword-face ((,class :foreground ,magenta-alt-other)))
+ `(indium-litable-face ((,class :foreground ,fg-special-warm :slant ,modus-theme-slant)))
+ `(indium-repl-error-face ((,class :inherit bold :foreground ,red)))
+ `(indium-repl-prompt-face ((,class :foreground ,cyan-alt-other)))
+ `(indium-repl-stdout-face ((,class :foreground ,fg-main)))
+;;;;; info
+ `(Info-quoted ((,class :foreground ,magenta))) ; the capitalisation is canonical
+ `(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 (bold ,modus-theme-variable-pitch) :foreground ,fg-main
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-2))))
+ `(info-menu-star ((,class :foreground ,fg-main)))
+ `(info-node ((,class :inherit bold)))
+ `(info-title-1 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-main
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4))))
+ `(info-title-2 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-warm
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-3))))
+ `(info-title-3 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-cold
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-2))))
+ `(info-title-4 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-mild
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-1))))
+;;;;; info-colors
+ `(info-colors-lisp-code-block ((,class :inherit fixed-pitch)))
+ `(info-colors-ref-item-command ((,class :foreground ,magenta)))
+ `(info-colors-ref-item-constant ((,class :foreground ,blue-alt-other)))
+ `(info-colors-ref-item-function ((,class :foreground ,magenta)))
+ `(info-colors-ref-item-macro ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,magenta-alt-other)))
+ `(info-colors-ref-item-other ((,class :foreground ,cyan)))
+ `(info-colors-ref-item-special-form ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,magenta-alt-other)))
+ `(info-colors-ref-item-syntax-class ((,class :foreground ,magenta)))
+ `(info-colors-ref-item-type ((,class :foreground ,magenta-alt)))
+ `(info-colors-ref-item-user-option ((,class :foreground ,cyan)))
+ `(info-colors-ref-item-variable ((,class :foreground ,cyan)))
+;;;;; interaction-log
+ `(ilog-buffer-face ((,class :foreground ,magenta-alt-other)))
+ `(ilog-change-face ((,class :foreground ,magenta-alt)))
+ `(ilog-echo-face ((,class :foreground ,yellow-alt-other)))
+ `(ilog-load-face ((,class :foreground ,green)))
+ `(ilog-message-face ((,class :foreground ,fg-alt)))
+ `(ilog-non-change-face ((,class :foreground ,blue)))
+;;;;; 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 ,@(and (>= emacs-major-version 27) '(:extend t))
+ :inherit modus-theme-special-cold)))
+ `(ioccur-num-line-face ((,class :foreground ,fg-special-warm)))
+ `(ioccur-overlay-face ((,class ,@(and (>= emacs-major-version 27) '(:extend t))
+ :inherit modus-theme-refine-blue)))
+ `(ioccur-regexp-face ((,class :inherit (modus-theme-intense-magenta bold))))
+ `(ioccur-title-face ((,class :inherit bold :foreground ,red-alt
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4))))
+;;;;; isearch, occur, and the like
+ `(isearch ((,class :inherit (modus-theme-intense-green bold))))
+ `(isearch-fail ((,class :inherit modus-theme-refine-red)))
+ `(lazy-highlight ((,class :inherit modus-theme-refine-cyan)))
+ `(match ((,class :inherit modus-theme-special-calm)))
+ `(query-replace ((,class :inherit (modus-theme-intense-yellow bold))))
+;;;;; ivy
+ `(ivy-action ((,class :inherit bold :foreground ,red-alt)))
+ `(ivy-completions-annotations ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(ivy-confirm-face ((,class :foreground ,cyan)))
+ `(ivy-current-match ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-refine-cyan
+ 'modus-theme-intense-cyan
+ 'modus-theme-special-warm
+ nil
+ 'bold))))
+ `(ivy-cursor ((,class :background ,fg-main :foreground ,bg-main)))
+ `(ivy-grep-info ((,class :foreground ,cyan-alt)))
+ `(ivy-grep-line-number ((,class :foreground ,fg-special-warm)))
+ `(ivy-highlight-face ((,class :foreground ,magenta)))
+ `(ivy-match-required-face ((,class :inherit error)))
+ `(ivy-minibuffer-match-face-1 ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-neutral
+ 'modus-theme-intense-neutral
+ 'modus-theme-subtle-neutral
+ fg-alt))))
+ `(ivy-minibuffer-match-face-2 ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-green
+ 'modus-theme-refine-green
+ 'modus-theme-nuanced-green
+ green-alt-other
+ 'bold))))
+ `(ivy-minibuffer-match-face-3 ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-cyan
+ 'modus-theme-refine-cyan
+ 'modus-theme-nuanced-cyan
+ cyan-alt-other
+ 'bold))))
+ `(ivy-minibuffer-match-face-4 ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-refine-magenta
+ 'modus-theme-nuanced-magenta
+ magenta-alt-other
+ 'bold))))
+ `(ivy-minibuffer-match-highlight ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-blue
+ 'modus-theme-intense-blue
+ 'modus-theme-nuanced-blue
+ blue-alt-other
+ 'bold))))
+ `(ivy-modified-buffer ((,class :foreground ,yellow :slant ,modus-theme-slant)))
+ `(ivy-modified-outside-buffer ((,class :foreground ,yellow-alt :slant ,modus-theme-slant)))
+ `(ivy-org ((,class :foreground ,cyan-alt-other)))
+ `(ivy-prompt-match ((,class :inherit ivy-current-match)))
+ `(ivy-remote ((,class :foreground ,magenta)))
+ `(ivy-separator ((,class :foreground ,fg-alt)))
+ `(ivy-subdir ((,class :foreground ,blue-alt-other)))
+ `(ivy-virtual ((,class :foreground ,magenta-alt-other)))
+ `(ivy-yanked-word ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-blue
+ 'modus-theme-refine-blue
+ 'modus-theme-nuanced-blue
+ blue-alt))))
+;;;;; ivy-posframe
+ `(ivy-posframe ((,class :background ,bg-dim :foreground ,fg-main)))
+ `(ivy-posframe-border ((,class :background ,bg-active)))
+ `(ivy-posframe-cursor ((,class :background ,fg-main :foreground ,bg-main)))
+;;;;; 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-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-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)))
+;;;;; 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-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-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)))
+;;;;; julia
+ `(julia-macro-face ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,magenta)))
+ `(julia-quoted-symbol-face ((,class :foreground ,blue-alt-other)))
+;;;;; 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)))
+;;;;; 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 :box ,(modus-operandi-theme-modeline-box blue-alt blue-active t -3)
+ ,@(modus-operandi-theme-modeline-props
+ blue-active bg-main
+ blue-active bg-active))))
+;;;;; line numbers (display-line-numbers-mode and global variant)
+ `(line-number ((,class :background ,bg-dim :foreground ,fg-alt)))
+ `(line-number-current-line ((,class :inherit bold :background ,bg-active :foreground ,fg-active)))
+;;;;; 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-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-enummember ((,class :foreground ,blue-alt-other)))
+ `(lsp-face-semhl-field ((,class :foreground ,cyan-alt)))
+ `(lsp-face-semhl-field-static ((,class :foreground ,cyan-alt :slant ,modus-theme-slant)))
+ `(lsp-face-semhl-function ((,class :foreground ,magenta)))
+ `(lsp-face-semhl-method ((,class :foreground ,magenta)))
+ `(lsp-face-semhl-namespace ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,magenta-alt)))
+ `(lsp-face-semhl-preprocessor ((,class :foreground ,red-alt-other)))
+ `(lsp-face-semhl-static-method ((,class :foreground ,magenta :slant ,modus-theme-slant)))
+ `(lsp-face-semhl-type-class ((,class :foreground ,magenta-alt)))
+ `(lsp-face-semhl-type-enum ((,class :foreground ,magenta-alt)))
+ `(lsp-face-semhl-type-primitive ((,class :foreground ,magenta-alt :slant ,modus-theme-slant)))
+ `(lsp-face-semhl-type-template ((,class :foreground ,magenta-alt :slant ,modus-theme-slant)))
+ `(lsp-face-semhl-type-typedef ((,class :foreground ,magenta-alt :slant ,modus-theme-slant)))
+ `(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)))
+ `(lsp-lens-face ((,class :height 0.8 :foreground ,fg-alt)))
+ `(lsp-lens-mouse-face ((,class :height 0.8 :foreground ,blue-alt-other :underline t)))
+ `(lsp-ui-doc-background ((,class :background ,bg-alt)))
+ `(lsp-ui-doc-header ((,class :background ,bg-header :foreground ,fg-header)))
+ `(lsp-ui-doc-url ((,class :foreground ,blue-alt-other :underline t)))
+ `(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-line-number ((,class :foreground ,fg-alt)))
+ `(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-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)))
+ `(lsp-ui-sideline-symbol-info ((,class :height 0.99 :slant italic)))
+;;;;; magit
+ `(magit-bisect-bad ((,class :foreground ,red-alt-other)))
+ `(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 :foreground ,fg-alt)))
+ `(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-name ((,class :foreground ,magenta-alt-other)))
+ `(magit-blame-summary ((,class :foreground ,cyan-alt-other)))
+ `(magit-branch-current ((,class :foreground ,blue-alt-other :box t)))
+ `(magit-branch-local ((,class :foreground ,blue-alt)))
+ `(magit-branch-remote ((,class :foreground ,magenta-alt)))
+ `(magit-branch-remote-head ((,class :foreground ,magenta-alt-other :box t)))
+ `(magit-branch-upstream ((,class :slant italic)))
+ `(magit-cherry-equivalent ((,class :background ,bg-main :foreground ,magenta-intense)))
+ `(magit-cherry-unmatched ((,class :background ,bg-main :foreground ,cyan-intense)))
+ `(magit-diff-added ((,class ,@(modus-operandi-theme-diffs
+ bg-main green
+ bg-diff-added fg-diff-added))))
+ `(magit-diff-added-highlight ((,class ,@(modus-operandi-theme-diffs
+ bg-dim green
+ bg-diff-focus-added fg-diff-focus-added))))
+ `(magit-diff-base ((,class ,@(modus-operandi-theme-diffs
+ bg-main yellow
+ bg-diff-changed fg-diff-changed))))
+ `(magit-diff-base-highlight ((,class ,@(modus-operandi-theme-diffs
+ bg-dim yellow
+ bg-diff-focus-changed fg-diff-focus-changed))))
+ `(magit-diff-context ((,class :foreground ,fg-unfocused)))
+ `(magit-diff-context-highlight ((,class ,@(modus-operandi-theme-diffs
+ bg-dim fg-dim
+ bg-inactive fg-inactive))))
+ `(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 :background ,bg-alt :foreground ,cyan)))
+ `(magit-diff-hunk-heading ((,class :inherit bold :background ,bg-active :foreground ,fg-inactive)))
+ `(magit-diff-hunk-heading-highlight ((,class :inherit (modus-theme-diff-heading bold))))
+ `(magit-diff-hunk-heading-selection ((,class :inherit modus-theme-intense-cyan)))
+ `(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-removed ((,class ,@(modus-operandi-theme-diffs
+ bg-main red
+ bg-diff-removed fg-diff-removed))))
+ `(magit-diff-removed-highlight ((,class ,@(modus-operandi-theme-diffs
+ bg-dim red
+ bg-diff-focus-removed fg-diff-focus-removed))))
+ `(magit-diffstat-added ((,class :foreground ,green)))
+ `(magit-diffstat-removed ((,class :foreground ,red)))
+ `(magit-dimmed ((,class :foreground ,fg-unfocused)))
+ `(magit-filename ((,class :foreground ,fg-special-cold)))
+ `(magit-hash ((,class :foreground ,fg-alt)))
+ `(magit-head ((,class :inherit magit-branch-local)))
+ `(magit-header-line ((,class :inherit bold :foreground ,magenta-active)))
+ `(magit-header-line-key ((,class :inherit bold :foreground ,red-active)))
+ `(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)))
+ `(magit-log-author ((,class :foreground ,cyan)))
+ `(magit-log-date ((,class :foreground ,fg-alt)))
+ `(magit-log-graph ((,class :foreground ,fg-dim)))
+ `(magit-mode-line-process ((,class :inherit bold :foreground ,blue-active)))
+ `(magit-mode-line-process-error ((,class :inherit bold :foreground ,red-active)))
+ `(magit-process-ng ((,class :inherit error)))
+ `(magit-process-ok ((,class :inherit success)))
+ `(magit-reflog-amend ((,class :background ,bg-main :foreground ,magenta-intense)))
+ `(magit-reflog-checkout ((,class :background ,bg-main :foreground ,blue-intense)))
+ `(magit-reflog-cherry-pick ((,class :background ,bg-main :foreground ,green-intense)))
+ `(magit-reflog-commit ((,class :background ,bg-main :foreground ,green-intense)))
+ `(magit-reflog-merge ((,class :background ,bg-main :foreground ,green-intense)))
+ `(magit-reflog-other ((,class :background ,bg-main :foreground ,cyan-intense)))
+ `(magit-reflog-rebase ((,class :background ,bg-main :foreground ,magenta-intense)))
+ `(magit-reflog-remote ((,class :background ,bg-main :foreground ,cyan-intense)))
+ `(magit-reflog-reset ((,class :background ,bg-main :foreground ,red-intense)))
+ `(magit-refname ((,class :foreground ,fg-alt)))
+ `(magit-refname-pullreq ((,class :foreground ,fg-alt)))
+ `(magit-refname-stash ((,class :foreground ,fg-alt)))
+ `(magit-refname-wip ((,class :foreground ,fg-alt)))
+ `(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-highlight ((,class :background ,bg-alt)))
+ `(magit-sequence-done ((,class :foreground ,green-alt)))
+ `(magit-sequence-drop ((,class :foreground ,red-alt)))
+ `(magit-sequence-exec ((,class :foreground ,magenta-alt)))
+ `(magit-sequence-head ((,class :foreground ,cyan-alt)))
+ `(magit-sequence-onto ((,class :foreground ,fg-alt)))
+ `(magit-sequence-part ((,class :foreground ,yellow-alt)))
+ `(magit-sequence-pick ((,class :foreground ,blue-alt)))
+ `(magit-sequence-stop ((,class :foreground ,red)))
+ `(magit-signature-bad ((,class :inherit bold :foreground ,red)))
+ `(magit-signature-error ((,class :foreground ,red-alt)))
+ `(magit-signature-expired ((,class :foreground ,yellow)))
+ `(magit-signature-expired-key ((,class :foreground ,yellow)))
+ `(magit-signature-good ((,class :foreground ,green)))
+ `(magit-signature-revoked ((,class :foreground ,magenta)))
+ `(magit-signature-untrusted ((,class :foreground ,cyan)))
+ `(magit-tag ((,class :foreground ,yellow-alt-other)))
+;;;;; magit-imerge
+ `(magit-imerge-overriding-value ((,class :inherit bold :foreground ,red-alt)))
+;;;;; man
+ `(Man-overstrike ((,class :inherit bold :foreground ,magenta)))
+ `(Man-reverse ((,class :inherit modus-theme-subtle-magenta)))
+ `(Man-underline ((,class :foreground ,cyan :underline t)))
+;;;;; markdown-mode
+ `(markdown-blockquote-face ((,class :foreground ,fg-special-warm :slant ,modus-theme-slant)))
+ `(markdown-bold-face ((,class :inherit bold)))
+ `(markdown-code-face ((,class :inherit fixed-pitch)))
+ `(markdown-comment-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(markdown-footnote-marker-face ((,class :inherit bold :foreground ,cyan-alt)))
+ `(markdown-footnote-text-face ((,class :foreground ,fg-main :slant ,modus-theme-slant)))
+ `(markdown-gfm-checkbox-face ((,class :foreground ,cyan-alt-other)))
+ `(markdown-header-delimiter-face ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,fg-dim)))
+ `(markdown-header-face ((,class :inherit bold)))
+ `(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 :inherit fixed-pitch :foreground ,cyan)))
+ `(markdown-html-attr-value-face ((,class :inherit fixed-pitch :foreground ,blue)))
+ `(markdown-html-entity-face ((,class :inherit fixed-pitch :foreground ,cyan)))
+ `(markdown-html-tag-delimiter-face ((,class :inherit fixed-pitch :foreground ,fg-special-mild)))
+ `(markdown-html-tag-name-face ((,class :inherit fixed-pitch :foreground ,magenta-alt)))
+ `(markdown-inline-code-face ((,class :inherit fixed-pitch :foreground ,magenta)))
+ `(markdown-italic-face ((,class :foreground ,fg-special-cold :slant italic)))
+ `(markdown-language-info-face ((,class :inherit fixed-pitch :foreground ,fg-special-cold)))
+ `(markdown-language-keyword-face ((,class :inherit fixed-pitch :foreground ,green-alt-other)))
+ `(markdown-line-break-face ((,class :inherit modus-theme-refine-cyan :underline t)))
+ `(markdown-link-face ((,class :inherit link)))
+ `(markdown-link-title-face ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(markdown-list-face ((,class :foreground ,fg-dim)))
+ `(markdown-markup-face ((,class :foreground ,fg-alt)))
+ `(markdown-math-face ((,class :foreground ,magenta-alt-other)))
+ `(markdown-metadata-key-face ((,class :foreground ,cyan-alt-other)))
+ `(markdown-metadata-value-face ((,class :foreground ,blue-alt)))
+ `(markdown-missing-link-face ((,class :inherit bold :foreground ,yellow)))
+ `(markdown-plain-url-face ((,class :inherit markdown-link-face)))
+ `(markdown-pre-face ((,class ,@(and (>= emacs-major-version 27) '(:extend t))
+ :inherit fixed-pitch :background ,bg-dim
+ :foreground ,fg-special-mild)))
+ `(markdown-reference-face ((,class :inherit markdown-markup-face)))
+ `(markdown-strike-through-face ((,class :strike-through t)))
+ `(markdown-table-face ((,class :inherit fixed-pitch :foreground ,fg-special-cold)))
+ `(markdown-url-face ((,class :foreground ,blue)))
+;;;;; markup-faces (`adoc-mode')
+ `(markup-anchor-face ((,class :foreground ,fg-inactive)))
+ `(markup-attribute-face ((,class :foreground ,fg-inactive :slant italic)))
+ `(markup-big-face ((,class :height 1.3 :foreground ,blue-nuanced)))
+ `(markup-bold-face ((,class :inherit bold :foreground ,red-nuanced)))
+ `(markup-code-face ((,class :inherit fixed-pitch :foreground ,magenta)))
+ `(markup-command-face ((,class :foreground ,fg-inactive)))
+ `(markup-comment-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(markup-complex-replacement-face ((,class :box (:line-width 2 :color nil :style released-button)
+ :inherit modus-theme-refine-magenta)))
+ `(markup-emphasis-face ((,class :foreground ,fg-special-cold :slant italic)))
+ `(markup-error-face ((,class :inherit bold :foreground ,red)))
+ `(markup-gen-face ((,class :foreground ,magenta-alt)))
+ `(markup-internal-reference-face ((,class :foreground ,fg-inactive :underline t)))
+ `(markup-italic-face ((,class :foreground ,fg-special-cold :slant italic)))
+ `(markup-list-face ((,class :inherit modus-theme-special-calm)))
+ `(markup-meta-face ((,class :foreground ,fg-inactive)))
+ `(markup-meta-hide-face ((,class :foreground ,fg-alt)))
+ `(markup-passthrough-face ((,class :inherit fixed-pitch :foreground ,cyan)))
+ `(markup-preprocessor-face ((,class :foreground ,red-alt-other)))
+ `(markup-replacement-face ((,class :foreground ,yellow-alt-other)))
+ `(markup-secondary-text-face ((,class :height 0.8 :foreground ,magenta-nuanced)))
+ `(markup-small-face ((,class :height 0.8 :foreground ,fg-main)))
+ `(markup-strong-face ((,class :inherit bold :foreground ,red-nuanced)))
+ `(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-title-0-face ((,class :height 3.0 :foreground ,blue-nuanced)))
+ `(markup-title-1-face ((,class :height 2.4 :foreground ,blue-nuanced)))
+ `(markup-title-2-face ((,class :height 1.8 :foreground ,blue-nuanced)))
+ `(markup-title-3-face ((,class :height 1.4 :foreground ,blue-nuanced)))
+ `(markup-title-4-face ((,class :height 1.2 :foreground ,blue-nuanced)))
+ `(markup-title-5-face ((,class :height 1.2 :foreground ,blue-nuanced :underline t)))
+ `(markup-value-face ((,class :foreground ,fg-inactive)))
+ `(markup-verbatim-face ((,class :inherit modus-theme-special-mild)))
+;;;;; mentor
+ `(mentor-download-message ((,class :foreground ,fg-special-warm)))
+ `(mentor-download-name ((,class :foreground ,fg-special-cold)))
+ `(mentor-download-progress ((,class :foreground ,blue-alt-other)))
+ `(mentor-download-size ((,class :foreground ,magenta-alt-other)))
+ `(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-tracker-name ((,class :foreground ,magenta-alt)))
+;;;;; messages
+ `(message-cited-text-1 ((,class :foreground ,blue-alt)))
+ `(message-cited-text-2 ((,class :foreground ,red-alt)))
+ `(message-cited-text-3 ((,class :foreground ,green-alt)))
+ `(message-cited-text-4 ((,class :foreground ,magenta-alt)))
+ `(message-header-cc ((,class :foreground ,blue-alt)))
+ `(message-header-name ((,class :foreground ,green-alt-other)))
+ `(message-header-newsgroups ((,class :inherit bold :foreground ,blue)))
+ `(message-header-other ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(message-header-subject ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(message-header-to ((,class :inherit bold :foreground ,magenta-alt)))
+ `(message-header-xheader ((,class :foreground ,blue-alt-other)))
+ `(message-mml ((,class :foreground ,green-alt)))
+ `(message-separator ((,class :background ,bg-active :foreground ,fg-special-warm)))
+;;;;; minibuffer-line
+ `(minibuffer-line ((,class :foreground ,fg-main)))
+;;;;; minimap
+ `(minimap-active-region-background ((,class :background ,bg-active)))
+ `(minimap-current-line-face ((,class :background ,cyan-intense-bg :foreground ,fg-main)))
+;;;;; modeline
+ `(mode-line ((,class :box ,(modus-operandi-theme-modeline-box bg-active fg-alt t)
+ ,@(modus-operandi-theme-modeline-props
+ bg-active fg-dim
+ bg-active fg-active))))
+ `(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-inactive ((,class :box ,(modus-operandi-theme-modeline-box bg-active bg-region)
+ ,@(modus-operandi-theme-modeline-props
+ bg-dim fg-inactive
+ bg-inactive fg-inactive))))
+;;;;; mood-line
+ `(mood-line-modified ((,class :foreground ,magenta-active)))
+ `(mood-line-status-error ((,class :inherit bold :foreground ,red-active)))
+ `(mood-line-status-info ((,class :foreground ,cyan-active)))
+ `(mood-line-status-neutral ((,class :foreground ,blue-active)))
+ `(mood-line-status-success ((,class :foreground ,green-active)))
+ `(mood-line-status-warning ((,class :inherit bold :foreground ,yellow-active)))
+ `(mood-line-unimportant ((,class :foreground ,fg-inactive)))
+;;;;; mu4e
+ `(mu4e-attach-number-face ((,class :inherit bold :foreground ,cyan-alt)))
+ `(mu4e-cited-1-face ((,class :foreground ,blue-alt)))
+ `(mu4e-cited-2-face ((,class :foreground ,red-alt)))
+ `(mu4e-cited-3-face ((,class :foreground ,green-alt)))
+ `(mu4e-cited-4-face ((,class :foreground ,magenta-alt)))
+ `(mu4e-cited-5-face ((,class :foreground ,yellow-alt)))
+ `(mu4e-cited-6-face ((,class :foreground ,cyan-alt)))
+ `(mu4e-cited-7-face ((,class :foreground ,magenta)))
+ `(mu4e-compose-header-face ((,class :inherit mu4e-compose-separator-face)))
+ `(mu4e-compose-separator-face ((,class :background ,bg-active :foreground ,fg-special-warm)))
+ `(mu4e-contact-face ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(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 :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(mu4e-forwarded-face ((,class :foreground ,magenta-alt-other)))
+ `(mu4e-header-face ((,class :foreground ,fg-alt)))
+ `(mu4e-header-highlight-face ((,class :inherit modus-theme-hl-line)))
+ `(mu4e-header-key-face ((,class :foreground ,cyan)))
+ `(mu4e-header-marks-face ((,class :inherit bold :foreground ,magenta-alt)))
+ `(mu4e-header-title-face ((,class :foreground ,fg-special-mild)))
+ `(mu4e-header-value-face ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(mu4e-highlight-face ((,class :inherit bold :foreground ,blue-alt-other)))
+ `(mu4e-link-face ((,class :inherit link)))
+ `(mu4e-modeline-face ((,class :foreground ,magenta-active)))
+ `(mu4e-moved-face ((,class :foreground ,yellow :slant ,modus-theme-slant)))
+ `(mu4e-ok-face ((,class :inherit bold :foreground ,green)))
+ `(mu4e-region-code ((,class :inherit modus-theme-special-calm)))
+ `(mu4e-replied-face ((,class :foreground ,cyan-active)))
+ `(mu4e-special-header-value-face ((,class :inherit bold :foreground ,blue-alt-other)))
+ `(mu4e-system-face ((,class :foreground ,fg-mark-del :slant ,modus-theme-slant)))
+ `(mu4e-title-face ((,class :foreground ,fg-main)))
+ `(mu4e-trashed-face ((,class :foreground ,red)))
+ `(mu4e-unread-face ((,class :inherit bold :foreground ,fg-main)))
+ `(mu4e-url-number-face ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(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-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)))
+ `(mu4e-conversation-sender-4 ((,class :foreground ,fg-alt)))
+ `(mu4e-conversation-sender-5 ((,class :foreground ,yellow-refine-fg)))
+ `(mu4e-conversation-sender-6 ((,class :foreground ,cyan-refine-fg)))
+ `(mu4e-conversation-sender-7 ((,class :foreground ,green-refine-fg)))
+ `(mu4e-conversation-sender-8 ((,class :foreground ,blue-refine-fg)))
+ `(mu4e-conversation-sender-me ((,class :foreground ,fg-main)))
+ `(mu4e-conversation-unread ((,class :inherit bold)))
+;;;;; multiple-cursors
+ `(mc/cursor-bar-face ((,class :height 1 :background ,fg-main)))
+ `(mc/cursor-face ((,class :inverse-video t)))
+ `(mc/region-face ((,class :inherit region)))
+;;;;; neotree
+ `(neo-banner-face ((,class :foreground ,magenta)))
+ `(neo-button-face ((,class :inherit button)))
+ `(neo-dir-link-face ((,class :inherit bold :foreground ,blue)))
+ `(neo-expand-btn-face ((,class :foreground ,cyan)))
+ `(neo-file-link-face ((,class :foreground ,fg-main)))
+ `(neo-header-face ((,class :inherit bold :foreground ,fg-main)))
+ `(neo-root-dir-face ((,class :inherit bold :foreground ,cyan-alt)))
+ `(neo-vc-added-face ((,class :foreground ,green)))
+ `(neo-vc-conflict-face ((,class :inherit bold :foreground ,red)))
+ `(neo-vc-default-face ((,class :foreground ,fg-main)))
+ `(neo-vc-edited-face ((,class :foreground ,yellow)))
+ `(neo-vc-ignored-face ((,class :foreground ,fg-inactive)))
+ `(neo-vc-missing-face ((,class :foreground ,red-alt)))
+ `(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-up-to-date-face ((,class :foreground ,fg-alt)))
+ `(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-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-hello-logo-background ((,class :background ,bg-main)))
+ `(notmuch-message-summary-face ((,class :inherit modus-theme-nuanced-cyan)))
+ `(notmuch-search-flagged-face ((,class :foreground ,red-alt)))
+ `(notmuch-search-matching-authors ((,class :foreground ,fg-main)))
+ `(notmuch-search-non-matching-authors ((,class :foreground ,fg-alt)))
+ `(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-face ((,class :inherit bold :foreground ,blue-alt)))
+ `(notmuch-tag-flagged ((,class :foreground ,red-alt)))
+ `(notmuch-tag-unread ((,class :foreground ,magenta-alt)))
+ `(notmuch-tree-match-author-face ((,class :foreground ,fg-special-cold)))
+ `(notmuch-tree-match-face ((,class :foreground ,fg-main)))
+ `(notmuch-tree-match-tag-face ((,class :inherit bold :foreground ,blue-alt)))
+ `(notmuch-tree-no-match-face ((,class :foreground ,fg-alt)))
+ `(notmuch-wash-cited-text ((,class :foreground ,cyan)))
+ `(notmuch-wash-toggle-button ((,class :background ,bg-alt :foreground ,fg-alt)))
+;;;;; num3-mode
+ `(num3-face-even ((,class :inherit bold :background ,bg-alt)))
+;;;;; nxml-mode
+ `(nxml-attribute-colon ((,class :foreground ,fg-main)))
+ `(nxml-attribute-local-name ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan-alt cyan-alt-faint))))
+ `(nxml-attribute-prefix ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(nxml-attribute-value ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue blue-faint))))
+ `(nxml-cdata-section-CDATA ((,class ,@(modus-operandi-theme-syntax-foreground
+ red-alt red-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(nxml-cdata-section-delimiter ((,class ,@(modus-operandi-theme-syntax-foreground
+ red-alt red-alt-faint))))
+ `(nxml-char-ref-delimiter ((,class ,@(modus-operandi-theme-syntax-foreground
+ green-alt-other green-alt-other-faint))))
+ `(nxml-char-ref-number ((,class ,@(modus-operandi-theme-syntax-foreground
+ green-alt-other green-alt-other-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(nxml-delimited-data ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(nxml-delimiter ((,class :foreground ,fg-dim)))
+ `(nxml-element-colon ((,class :foreground ,fg-main)))
+ `(nxml-element-local-name ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(nxml-element-prefix ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(nxml-entity-ref-delimiter ((,class ,@(modus-operandi-theme-syntax-foreground
+ green-alt-other green-alt-other-faint))))
+ `(nxml-entity-ref-name ((,class ,@(modus-operandi-theme-syntax-foreground
+ green-alt-other green-alt-other-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(nxml-glyph ((,class :inherit modus-theme-intense-neutral)))
+ `(nxml-hash ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue-alt blue-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(nxml-heading ((,class :inherit bold)))
+ `(nxml-name ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(nxml-namespace-attribute-colon ((,class :foreground ,fg-main)))
+ `(nxml-namespace-attribute-prefix ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(nxml-processing-instruction-target ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(nxml-prolog-keyword ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(nxml-ref ((,class ,@(modus-operandi-theme-syntax-foreground
+ green-alt-other green-alt-other-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+;;;;; orderless
+ `(orderless-match-face-0 ((,class :inherit bold
+ ,@(modus-operandi-theme-standard-completions
+ blue-alt blue-nuanced-bg
+ blue-refine-bg blue-refine-fg))))
+ `(orderless-match-face-1 ((,class :inherit bold
+ ,@(modus-operandi-theme-standard-completions
+ magenta-alt magenta-nuanced-bg
+ magenta-refine-bg magenta-refine-fg))))
+ `(orderless-match-face-2 ((,class :inherit bold
+ ,@(modus-operandi-theme-standard-completions
+ green-alt-other green-nuanced-bg
+ green-refine-bg green-refine-fg))))
+ `(orderless-match-face-3 ((,class :inherit bold
+ ,@(modus-operandi-theme-standard-completions
+ yellow-alt-other yellow-nuanced-bg
+ yellow-refine-bg yellow-refine-fg))))
+;;;;; 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)))
+ `(org-agenda-column-dateline ((,class :background ,bg-alt)))
+ `(org-agenda-current-time ((,class :inherit modus-theme-subtle-cyan)))
+ `(org-agenda-date ((,class :inherit ,modus-theme-variable-pitch :foreground ,cyan-alt-other
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4)
+ ,@(modus-operandi-theme-heading-block cyan-nuanced-bg cyan-nuanced))))
+ `(org-agenda-date-today ((,class :inherit (bold ,modus-theme-variable-pitch)
+ :background ,cyan-intense-bg :foreground ,fg-main
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4))))
+ `(org-agenda-date-weekend ((,class :inherit ,modus-theme-variable-pitch :foreground ,cyan
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4)
+ ,@(modus-operandi-theme-heading-block blue-nuanced-bg cyan-nuanced))))
+ `(org-agenda-diary ((,class :foreground ,fg-main)))
+ `(org-agenda-dimmed-todo-face ((,class :inherit modus-theme-subtle-neutral)))
+ `(org-agenda-done ((,class ,@(modus-operandi-theme-org-todo-block green-nuanced-bg green-nuanced green))))
+ `(org-agenda-filter-category ((,class :inherit bold :foreground ,magenta-active)))
+ `(org-agenda-filter-effort ((,class :inherit bold :foreground ,magenta-active)))
+ `(org-agenda-filter-regexp ((,class :inherit bold :foreground ,magenta-active)))
+ `(org-agenda-filter-tags ((,class :inherit bold :foreground ,magenta-active)))
+ `(org-agenda-restriction-lock ((,class :background ,bg-dim :foreground ,fg-dim)))
+ `(org-agenda-structure ((,class :inherit ,modus-theme-variable-pitch
+ :foreground ,fg-special-mild
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-3))))
+ `(org-archived ((,class :background ,bg-alt :foreground ,fg-alt)))
+ `(org-block ((,class ,@(modus-operandi-theme-org-block bg-dim)
+ :inherit fixed-pitch :foreground ,fg-main)))
+ `(org-block-begin-line ((,class ,@(modus-operandi-theme-org-block-delim
+ bg-dim fg-special-cold
+ bg-alt fg-special-mild)
+ :inherit fixed-pitch)))
+ `(org-block-end-line ((,class :inherit org-block-begin-line)))
+ `(org-checkbox ((,class :box (:line-width 1 :color ,bg-active)
+ :background ,bg-inactive :foreground ,fg-active)))
+ `(org-checkbox-statistics-done ((,class :foreground ,green
+ ,@(modus-operandi-theme-heading-block
+ green-nuanced-bg green-nuanced))))
+ `(org-checkbox-statistics-todo ((,class ,@(modus-operandi-theme-heading-foreground red-alt red)
+ ,@(modus-operandi-theme-heading-block
+ red-nuanced-bg red-nuanced))))
+ `(org-clock-overlay ((,class :inherit modus-theme-special-cold)))
+ `(org-code ((,class :inherit fixed-pitch :foreground ,magenta)))
+ `(org-column ((,class :background ,bg-alt)))
+ `(org-column-title ((,class :inherit bold :underline t :background ,bg-alt)))
+ `(org-date ((,class :inherit fixed-pitch :foreground ,cyan-alt-other :underline t)))
+ `(org-date-selected ((,class :inherit bold :foreground ,blue-alt :inverse-video t)))
+ `(org-default ((,class :background ,bg-main :foreground ,fg-main)))
+ `(org-document-info ((,class :foreground ,fg-special-cold)))
+ `(org-document-info-keyword ((,class :inherit fixed-pitch :foreground ,fg-alt)))
+ `(org-document-title ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-cold
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-5))))
+ `(org-done ((,class ,@(modus-operandi-theme-org-todo-block green-nuanced-bg green-nuanced green))))
+ `(org-drawer ((,class :foreground ,cyan-alt)))
+ `(org-ellipsis ((,class :foreground nil))) ; inherits from the heading's colour
+ `(org-footnote ((,class :foreground ,blue-alt :underline t)))
+ `(org-formula ((,class :inherit fixed-pitch :foreground ,red-alt)))
+ `(org-habit-alert-face ((,class :inherit modus-theme-intense-yellow)))
+ `(org-habit-alert-future-face ((,class :inherit modus-theme-refine-yellow)))
+ `(org-habit-clear-face ((,class :inherit modus-theme-intense-magenta)))
+ `(org-habit-clear-future-face ((,class :inherit modus-theme-refine-magenta)))
+ `(org-habit-overdue-face ((,class :inherit modus-theme-intense-red)))
+ `(org-habit-overdue-future-face ((,class :inherit modus-theme-refine-red)))
+ `(org-habit-ready-face ((,class :inherit modus-theme-intense-blue)))
+ `(org-habit-ready-future-face ((,class :inherit modus-theme-refine-blue)))
+ `(org-headline-done ((,class :foreground ,green-nuanced
+ ,@(modus-operandi-theme-heading-block
+ green-nuanced-bg green-nuanced))))
+ `(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 (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-main magenta-alt-other)
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4)
+ ,@(modus-operandi-theme-heading-block magenta-nuanced-bg magenta-nuanced))))
+ `(org-level-2 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-special-warm magenta-alt)
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-3)
+ ,@(modus-operandi-theme-heading-block red-nuanced-bg red-nuanced))))
+ `(org-level-3 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-special-cold blue)
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-2)
+ ,@(modus-operandi-theme-heading-block blue-nuanced-bg blue-nuanced))))
+ `(org-level-4 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-special-mild cyan)
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-1)
+ ,@(modus-operandi-theme-heading-block cyan-nuanced-bg cyan-nuanced))))
+ `(org-level-5 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-special-calm green-alt-other)
+ ,@(modus-operandi-theme-heading-block green-nuanced-bg green-nuanced))))
+ `(org-level-6 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground yellow-nuanced yellow-alt-other)
+ ,@(modus-operandi-theme-heading-block yellow-nuanced-bg yellow-nuanced))))
+ `(org-level-7 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground red-nuanced red-alt)
+ ,@(modus-operandi-theme-heading-block red-nuanced-bg red-nuanced))))
+ `(org-level-8 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-dim magenta)
+ ,@(modus-operandi-theme-heading-block bg-alt fg-alt))))
+ `(org-link ((,class :inherit link)))
+ `(org-list-dt ((,class :inherit bold)))
+ `(org-macro ((,class :inherit org-latex-and-related)))
+ `(org-meta-line ((,class :inherit fixed-pitch :background ,cyan-nuanced-bg :foreground ,cyan-nuanced)))
+ `(org-mode-line-clock ((,class :foreground ,fg-main)))
+ `(org-mode-line-clock-overrun ((,class :inherit modus-theme-active-red)))
+ `(org-priority ((,class ,@(modus-operandi-theme-org-todo-block magenta-nuanced-bg magenta-nuanced magenta)
+ ,@(modus-operandi-theme-heading-foreground magenta magenta-alt-other))))
+ `(org-quote ((,class ,@(if modus-operandi-theme-org-blocks
+ (append
+ (and (>= emacs-major-version 27) '(:extend t))
+ (list :background bg-dim))
+ (list :background nil))
+ :foreground ,fg-special-calm :slant ,modus-theme-slant)))
+ `(org-scheduled ((,class :foreground ,fg-special-warm)))
+ `(org-scheduled-previously ((,class :foreground ,yellow-alt-other)))
+ `(org-scheduled-today ((,class :foreground ,magenta-alt-other)))
+ `(org-sexp-date ((,class :inherit org-date)))
+ `(org-special-keyword ((,class ,@(modus-operandi-theme-org-todo-block cyan-nuanced-bg cyan-nuanced cyan-alt))))
+ `(org-table ((,class :inherit fixed-pitch :foreground ,fg-special-cold)))
+ `(org-tag ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,magenta-nuanced)))
+ `(org-tag-group ((,class :inherit bold :foreground ,cyan-nuanced)))
+ `(org-target ((,class :underline t)))
+ `(org-time-grid ((,class :foreground ,fg-unfocused)))
+ `(org-todo ((,class ,@(modus-operandi-theme-org-todo-block red-nuanced-bg red-nuanced red-alt)
+ ,@(modus-operandi-theme-heading-foreground red-alt red))))
+ `(org-upcoming-deadline ((,class :foreground ,red-alt-other)))
+ `(org-upcoming-distant-deadline ((,class :foreground ,red-nuanced)))
+ `(org-verbatim ((,class :inherit fixed-pitch :background ,bg-alt :foreground ,fg-special-calm)))
+ `(org-verse ((,class :inherit org-quote)))
+ `(org-warning ((,class :inherit bold :foreground ,red-alt-other)))
+;;;;; org-journal
+ `(org-journal-calendar-entry-face ((,class :foreground ,yellow-alt-other :slant ,modus-theme-slant)))
+ `(org-journal-calendar-scheduled-face ((,class :foreground ,red-alt-other :slant ,modus-theme-slant)))
+ `(org-journal-highlight ((,class :foreground ,magenta-alt)))
+;;;;; org-noter
+ `(org-noter-no-notes-exist-face ((,class :inherit bold :foreground ,red-active)))
+ `(org-noter-notes-exist-face ((,class :inherit bold :foreground ,green-active)))
+;;;;; org-pomodoro
+ `(org-pomodoro-mode-line ((,class :foreground ,red-active)))
+ `(org-pomodoro-mode-line-break ((,class :foreground ,cyan-active)))
+ `(org-pomodoro-mode-line-overtime ((,class :inherit bold :foreground ,red-active)))
+;;;;; org-recur
+ `(org-recur ((,class :foreground ,magenta-active)))
+;;;;; org-roam
+ `(org-roam-link ((,class :foreground ,blue-alt-other :underline t)))
+ `(org-roam-backlink ((,class :foreground ,green-alt-other :underline t)))
+;;;;; org-superstar
+ `(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-treescope
+ `(org-treescope-faces--markerinternal-midday ((,class :inherit modus-theme-intense-blue)))
+ `(org-treescope-faces--markerinternal-range ((,class :inherit modus-theme-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 (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-main magenta-alt-other)
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4)
+ ,@(modus-operandi-theme-heading-block magenta-nuanced-bg magenta-nuanced))))
+ `(outline-2 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-special-warm magenta-alt)
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-3)
+ ,@(modus-operandi-theme-heading-block red-nuanced-bg red-nuanced))))
+ `(outline-3 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-special-cold blue)
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-2)
+ ,@(modus-operandi-theme-heading-block blue-nuanced-bg blue-nuanced))))
+ `(outline-4 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-special-mild cyan)
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-1)
+ ,@(modus-operandi-theme-heading-block cyan-nuanced-bg cyan-nuanced))))
+ `(outline-5 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-special-calm green-alt-other)
+ ,@(modus-operandi-theme-heading-block green-nuanced-bg green-nuanced))))
+ `(outline-6 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground yellow-nuanced yellow-alt-other)
+ ,@(modus-operandi-theme-heading-block yellow-nuanced-bg yellow-nuanced))))
+ `(outline-7 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground red-nuanced red-alt)
+ ,@(modus-operandi-theme-heading-block red-nuanced-bg red-nuanced))))
+ `(outline-8 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-operandi-theme-heading-foreground fg-dim magenta)
+ ,@(modus-operandi-theme-heading-block bg-alt fg-alt))))
+;;;;; outline-minor-faces
+ `(outline-minor-0 ((,class ,@(unless modus-operandi-theme-section-headings
+ (list :background cyan-nuanced-bg)))))
+;;;;; package (M-x list-packages)
+ `(package-description ((,class :foreground ,fg-special-cold)))
+ `(package-help-section-name ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(package-name ((,class :inherit link)))
+ `(package-status-avail-obso ((,class :inherit bold :foreground ,red)))
+ `(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-external ((,class :foreground ,cyan-alt-other)))
+ `(package-status-held ((,class :foreground ,yellow-alt)))
+ `(package-status-incompat ((,class :inherit bold :foreground ,yellow)))
+ `(package-status-installed ((,class :foreground ,fg-special-warm)))
+ `(package-status-new ((,class :inherit bold :foreground ,green)))
+ `(package-status-unsigned ((,class :inherit bold :foreground ,red-alt)))
+;;;;; page-break-lines
+ `(page-break-lines ((,class :inherit default :foreground ,fg-window-divider-outer)))
+;;;;; paradox
+ `(paradox-archive-face ((,class :foreground ,fg-special-mild)))
+ `(paradox-comment-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(paradox-commit-tag-face ((,class :inherit modus-theme-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 ,@(modus-operandi-theme-bold-weight) :foreground ,blue-alt-other)))
+ `(paradox-highlight-face ((,class ,@(modus-operandi-theme-bold-weight) :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)))
+ `(paradox-star-face ((,class :foreground ,magenta)))
+ `(paradox-starred-face ((,class :foreground ,magenta-alt)))
+;;;;; paren-face
+ `(parenthesis ((,class :foreground ,fg-unfocused)))
+;;;;; parrot
+ `(parrot-rotate-rotation-highlight-face ((,class :inherit modus-theme-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)))
+ `(pass-mode-header-face ((,class :foreground ,fg-special-warm)))
+;;;;; persp-mode
+ `(persp-face-lighter-buffer-not-in-persp ((,class :inherit modus-theme-intense-red)))
+ `(persp-face-lighter-default ((,class :inherit bold :foreground ,blue-active)))
+ `(persp-face-lighter-nil-persp ((,class :inherit bold :foreground ,fg-active)))
+;;;;; perspective
+ `(persp-selected-face ((,class :inherit bold :foreground ,blue-active)))
+;;;;; phi-grep
+ `(phi-grep-heading-face ((,class :inherit bold :foreground ,red-alt
+ ,@(modus-operandi-theme-scale modus-operandi-theme-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-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))))
+;;;;; pkgbuild-mode
+ `(pkgbuild-error-face ((,class :underline ,fg-lang-error)))
+;;;;; pomidor
+ `(pomidor-break-face ((,class :foreground ,blue-alt-other)))
+ `(pomidor-overwork-face ((,class :foreground ,red-alt-other)))
+ `(pomidor-skip-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(pomidor-work-face ((,class :foreground ,green-alt-other)))
+;;;;; powerline
+ `(powerline-active0 ((,class :background ,bg-main :foreground ,blue-faint :inverse-video t)))
+ `(powerline-active1 ((,class :background ,blue-nuanced-bg :foreground ,blue-nuanced)))
+ `(powerline-active2 ((,class :background ,bg-active :foreground ,fg-active)))
+ `(powerline-inactive0 ((,class :background ,bg-special-cold :foreground ,fg-special-cold)))
+ `(powerline-inactive1 ((,class :background ,bg-dim :foreground ,fg-inactive)))
+ `(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-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)))
+;;;;; proced
+ `(proced-mark ((,class :inherit modus-theme-mark-symbol)))
+ `(proced-marked ((,class :inherit modus-theme-mark-alt)))
+ `(proced-sort-header ((,class :inherit bold :foreground ,fg-special-calm :underline t)))
+;;;;; prodigy
+ `(prodigy-green-face ((,class :foreground ,green)))
+ `(prodigy-red-face ((,class :foreground ,red)))
+ `(prodigy-yellow-face ((,class :foreground ,yellow)))
+;;;;; rainbow-blocks
+ `(rainbow-blocks-depth-1-face ((,class :foreground ,magenta-alt-other)))
+ `(rainbow-blocks-depth-2-face ((,class :foreground ,blue)))
+ `(rainbow-blocks-depth-3-face ((,class :foreground ,magenta-alt)))
+ `(rainbow-blocks-depth-4-face ((,class :foreground ,green)))
+ `(rainbow-blocks-depth-5-face ((,class :foreground ,magenta)))
+ `(rainbow-blocks-depth-6-face ((,class :foreground ,cyan)))
+ `(rainbow-blocks-depth-7-face ((,class :foreground ,yellow)))
+ `(rainbow-blocks-depth-8-face ((,class :foreground ,cyan-alt)))
+ `(rainbow-blocks-depth-9-face ((,class :foreground ,red-alt)))
+ `(rainbow-blocks-unmatched-face ((,class :foreground ,red)))
+;;;;; rainbow-identifiers
+ `(rainbow-identifiers-identifier-1 ((,class :foreground ,green-alt-other)))
+ `(rainbow-identifiers-identifier-2 ((,class :foreground ,magenta-alt-other)))
+ `(rainbow-identifiers-identifier-3 ((,class :foreground ,cyan-alt-other)))
+ `(rainbow-identifiers-identifier-4 ((,class :foreground ,yellow-alt-other)))
+ `(rainbow-identifiers-identifier-5 ((,class :foreground ,blue-alt-other)))
+ `(rainbow-identifiers-identifier-6 ((,class :foreground ,green-alt)))
+ `(rainbow-identifiers-identifier-7 ((,class :foreground ,magenta-alt)))
+ `(rainbow-identifiers-identifier-8 ((,class :foreground ,cyan-alt)))
+ `(rainbow-identifiers-identifier-9 ((,class :foreground ,yellow-alt)))
+ `(rainbow-identifiers-identifier-10 ((,class :foreground ,green)))
+ `(rainbow-identifiers-identifier-11 ((,class :foreground ,magenta)))
+ `(rainbow-identifiers-identifier-12 ((,class :foreground ,cyan)))
+ `(rainbow-identifiers-identifier-13 ((,class :foreground ,yellow)))
+ `(rainbow-identifiers-identifier-14 ((,class :foreground ,blue-alt)))
+ `(rainbow-identifiers-identifier-15 ((,class :foreground ,red-alt)))
+;;;;; rainbow-delimiters
+ `(rainbow-delimiters-base-face-error ((,class :foreground ,red)))
+ `(rainbow-delimiters-base-face ((,class :foreground ,fg-main)))
+ `(rainbow-delimiters-depth-1-face ((,class :foreground ,green-alt-other)))
+ `(rainbow-delimiters-depth-2-face ((,class :foreground ,magenta-alt-other)))
+ `(rainbow-delimiters-depth-3-face ((,class :foreground ,cyan-alt-other)))
+ `(rainbow-delimiters-depth-4-face ((,class :foreground ,yellow-alt-other)))
+ `(rainbow-delimiters-depth-5-face ((,class :foreground ,blue-alt-other)))
+ `(rainbow-delimiters-depth-6-face ((,class :foreground ,green-alt)))
+ `(rainbow-delimiters-depth-7-face ((,class :foreground ,magenta-alt)))
+ `(rainbow-delimiters-depth-8-face ((,class :foreground ,cyan-alt)))
+ `(rainbow-delimiters-depth-9-face ((,class :foreground ,yellow-alt)))
+ `(rainbow-delimiters-mismatched-face ((,class :inherit bold :foreground ,red-alt)))
+ `(rainbow-delimiters-unmatched-face ((,class :inherit bold :foreground ,red)))
+;;;;; rcirc
+ `(rcirc-bright-nick ((,class :inherit bold :foreground ,magenta-alt)))
+ `(rcirc-dim-nick ((,class :foreground ,fg-alt)))
+ `(rcirc-my-nick ((,class :inherit bold :foreground ,magenta)))
+ `(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-server ((,class :foreground ,fg-unfocused)))
+ `(rcirc-timestamp ((,class :foreground ,blue-nuanced)))
+ `(rcirc-url ((,class :foreground ,blue :underline t)))
+;;;;; regexp-builder (re-builder)
+ `(reb-match-0 ((,class :inherit modus-theme-intense-blue)))
+ `(reb-match-1 ((,class :inherit modus-theme-intense-magenta)))
+ `(reb-match-2 ((,class :inherit modus-theme-intense-green)))
+ `(reb-match-3 ((,class :inherit modus-theme-intense-red)))
+ `(reb-regexp-grouping-backslash ((,class :inherit bold :foreground ,fg-escape-char-backslash)))
+ `(reb-regexp-grouping-construct ((,class :inherit bold :foreground ,fg-escape-char-construct)))
+;;;;; rg (rg.el)
+ `(rg-column-number-face ((,class :foreground ,magenta-alt-other)))
+ `(rg-context-face ((,class :foreground ,fg-unfocused)))
+ `(rg-error-face ((,class :inherit bold :foreground ,red)))
+ `(rg-file-tag-face ((,class :foreground ,fg-special-cold)))
+ `(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-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)))
+ `(rg-warning-face ((,class :inherit bold :foreground ,yellow)))
+;;;;; ripgrep
+ `(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)))
+;;;;; rmail
+ `(rmail-header-name ((,class :foreground ,cyan-alt-other)))
+ `(rmail-highlight ((,class :inherit bold :foreground ,magenta-alt)))
+;;;;; ruler-mode
+ `(ruler-mode-column-number ((,class :inherit (ruler-mode-default bold) :foreground ,fg-main)))
+ `(ruler-mode-comment-column ((,class :inherit ruler-mode-default :foreground ,red-active)))
+ `(ruler-mode-current-column ((,class :inherit ruler-mode-default :foreground ,cyan-active :box t)))
+ `(ruler-mode-default ((,class :background ,bg-inactive :foreground ,fg-inactive)))
+ `(ruler-mode-fill-column ((,class :inherit ruler-mode-default :foreground ,green-active)))
+ `(ruler-mode-fringes ((,class :inherit ruler-mode-default :foreground ,blue-active)))
+ `(ruler-mode-goal-column ((,class :inherit ruler-mode-default :foreground ,magenta-active)))
+ `(ruler-mode-margins ((,class :inherit ruler-mode-default :foreground ,bg-main)))
+ `(ruler-mode-pad ((,class :background ,bg-active :foreground ,fg-inactive)))
+ `(ruler-mode-tab-stop ((,class :inherit ruler-mode-default :foreground ,yellow-active)))
+;;;;; sallet
+ `(sallet-buffer-compressed ((,class :foreground ,yellow-nuanced :slant italic)))
+ `(sallet-buffer-default-directory ((,class :foreground ,cyan-nuanced)))
+ `(sallet-buffer-directory ((,class :foreground ,blue-nuanced)))
+ `(sallet-buffer-help ((,class :foreground ,fg-special-cold)))
+ `(sallet-buffer-modified ((,class :foreground ,yellow-alt-other :slant italic)))
+ `(sallet-buffer-ordinary ((,class :foreground ,fg-main)))
+ `(sallet-buffer-read-only ((,class :foreground ,yellow-alt)))
+ `(sallet-buffer-size ((,class :foreground ,fg-special-calm)))
+ `(sallet-buffer-special ((,class :foreground ,magenta-alt-other)))
+ `(sallet-flx-match ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-cyan
+ 'modus-theme-refine-cyan
+ 'modus-theme-nuanced-cyan
+ cyan-alt-other))))
+ `(sallet-recentf-buffer-name ((,class :foreground ,blue-nuanced)))
+ `(sallet-recentf-file-path ((,class :foreground ,fg-special-mild)))
+ `(sallet-regexp-match ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-refine-magenta
+ 'modus-theme-nuanced-magenta
+ magenta-alt-other))))
+ `(sallet-source-header ((,class :inherit bold :foreground ,red-alt
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4))))
+ `(sallet-substring-match ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-subtle-blue
+ 'modus-theme-refine-blue
+ 'modus-theme-nuanced-blue
+ blue-alt-other))))
+;;;;; selectrum
+ `(selectrum-current-candidate ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-refine-magenta
+ 'modus-theme-intense-magenta
+ 'modus-theme-nuanced-magenta
+ magenta
+ 'bold))))
+ `(selectrum-primary-highlight ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-refine-blue
+ 'modus-theme-intense-blue
+ 'modus-theme-nuanced-blue
+ blue
+ 'bold))))
+ `(selectrum-secondary-highlight ((,class ,@(modus-operandi-theme-extra-completions
+ 'modus-theme-refine-cyan
+ 'modus-theme-intense-cyan
+ 'modus-theme-nuanced-cyan
+ cyan
+ 'bold))))
+;;;;; semantic
+ `(semantic-complete-inline-face ((,class :foreground ,fg-special-warm :underline t)))
+ `(semantic-decoration-on-private-members-face ((,class :inherit modus-theme-refine-cyan)))
+ `(semantic-decoration-on-protected-members-face ((,class :background ,bg-dim)))
+ `(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-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-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 ,@(modus-operandi-theme-bold-weight) :foreground ,magenta-alt)))
+;;;;; show-paren-mode
+ `(show-paren-match ((,class ,@(modus-operandi-theme-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)))
+;;;;; side-notes
+ `(side-notes ((,class :background ,bg-dim :foreground ,fg-dim)))
+;;;;; skewer-mode
+ `(skewer-error-face ((,class :foreground ,red :underline t)))
+;;;;; smart-mode-line
+ `(sml/charging ((,class :foreground ,green-active)))
+ `(sml/discharging ((,class :foreground ,red-active)))
+ `(sml/filename ((,class :inherit bold :foreground ,blue-active)))
+ `(sml/folder ((,class :foreground ,fg-active)))
+ `(sml/git ((,class :inherit bold :foreground ,green-active)))
+ `(sml/global ((,class :foreground ,fg-active)))
+ `(sml/line-number ((,class :inherit sml/global)))
+ `(sml/minor-modes ((,class :inherit sml/global)))
+ `(sml/modes ((,class :inherit bold :foreground ,fg-active)))
+ `(sml/modified ((,class :inherit bold :foreground ,magenta-active)))
+ `(sml/mule-info ((,class :inherit sml/global)))
+ `(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/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/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-show-pair-match-face ((,class ,@(modus-operandi-theme-paren bg-paren-match
+ bg-paren-match-intense)
+ :foreground ,fg-main)))
+ `(sp-show-pair-mismatch-face ((,class :inherit modus-theme-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 ,@(modus-operandi-theme-diffs
+ bg-main yellow
+ bg-diff-focus-changed fg-diff-focus-changed))))
+ `(smerge-lower ((,class ,@(modus-operandi-theme-diffs
+ bg-main green
+ bg-diff-focus-added fg-diff-focus-added))))
+ `(smerge-markers ((,class :background ,bg-diff-neutral-2 :foreground ,fg-diff-neutral-2)))
+ `(smerge-refined-added ((,class ,@(modus-operandi-theme-diffs
+ bg-diff-added fg-diff-added
+ bg-diff-refine-added fg-diff-refine-added))))
+ `(smerge-refined-changed ((,class)))
+ `(smerge-refined-removed ((,class ,@(modus-operandi-theme-diffs
+ bg-diff-removed fg-diff-removed
+ bg-diff-refine-removed fg-diff-refine-removed))))
+ `(smerge-upper ((,class ,@(modus-operandi-theme-diffs
+ bg-main red
+ bg-diff-focus-removed fg-diff-focus-removed))))
+;;;;; 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-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-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-python-venv ((,class :foreground ,magenta-active)))
+ `(spaceline-read-only ((,class :inherit modus-theme-fringe-red)))
+ `(spaceline-unmodified ((,class :inherit modus-theme-fringe-cyan)))
+;;;;; speedbar
+ `(speedbar-button-face ((,class :inherit link)))
+ `(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-selected-face ((,class :inherit bold :foreground ,cyan)))
+ `(speedbar-separator-face ((,class :inherit modus-theme-intense-neutral)))
+ `(speedbar-tag-face ((,class :foreground ,yellow-alt-other)))
+;;;;; spell-fu
+ `(spell-fu-incorrect-face
+ ((,(append '((supports :underline (:style wave))) class)
+ :foreground ,fg-lang-error :underline (:style wave))
+ (,class :foreground ,fg-lang-error :underline t)))
+;;;;; stripes
+ `(stripes ((,class :inherit modus-theme-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-subtle-cyan)))
+ `(swiper-background-match-face-3 ((,class :inherit modus-theme-subtle-magenta)))
+ `(swiper-background-match-face-4 ((,class :inherit modus-theme-subtle-green)))
+ `(swiper-line-face ((,class ,@(and (>= emacs-major-version 27) '(:extend t))
+ :inherit modus-theme-special-cold)))
+ `(swiper-match-face-1 ((,class :inherit swiper-line-face)))
+ `(swiper-match-face-2 ((,class :inherit swiper-line-face)))
+ `(swiper-match-face-3 ((,class :inherit swiper-line-face)))
+ `(swiper-match-face-4 ((,class :inherit swiper-line-face)))
+;;;;; swoop
+ `(swoop-face-header-format-line ((,class :inherit bold :foreground ,red-alt
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-3))))
+ `(swoop-face-line-buffer-name ((,class :inherit bold :foreground ,blue-alt
+ ,@(modus-operandi-theme-scale modus-operandi-theme-scale-4))))
+ `(swoop-face-line-number ((,class :foreground ,fg-special-warm)))
+ `(swoop-face-target-line ((,class :inherit modus-theme-intense-blue
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(swoop-face-target-words ((,class :inherit modus-theme-refine-cyan)))
+;;;;; sx
+ `(sx-inbox-item-type ((,class :foreground ,magenta-alt-other)))
+ `(sx-inbox-item-type-unread ((,class :inherit (sx-inbox-item-type bold))))
+ `(sx-question-list-answers ((,class :foreground ,green)))
+ `(sx-question-list-answers-accepted ((,class :box t :foreground ,green)))
+ `(sx-question-list-bounty ((,class :inherit bold :background ,bg-alt :foreground ,yellow)))
+ `(sx-question-list-date ((,class :foreground ,fg-special-cold)))
+ `(sx-question-list-favorite ((,class :inherit bold :foreground ,fg-special-warm)))
+ `(sx-question-list-parent ((,class :foreground ,fg-main)))
+ `(sx-question-list-read-question ((,class :foreground ,fg-alt)))
+ `(sx-question-list-score ((,class :foreground ,fg-special-mild)))
+ `(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-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)))
+ `(sx-question-mode-header ((,class :inherit bold :foreground ,cyan)))
+ `(sx-question-mode-kbd-tag ((,class :inherit bold :height 0.9 :box (:line-width 3 :color ,fg-main :style released-button) :foreground ,fg-main)))
+ `(sx-question-mode-score ((,class :foreground ,fg-dim)))
+ `(sx-question-mode-score-downvoted ((,class :foreground ,yellow)))
+ `(sx-question-mode-score-upvoted ((,class :inherit bold :foreground ,magenta)))
+ `(sx-question-mode-title ((,class :inherit bold :foreground ,fg-main)))
+ `(sx-question-mode-title-comments ((,class :inherit bold :foreground ,fg-alt)))
+ `(sx-tag ((,class :foreground ,magenta-alt)))
+ `(sx-user-name ((,class :foreground ,blue-alt)))
+ `(sx-user-reputation ((,class :foreground ,fg-alt)))
+;;;;; 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)))
+;;;;; syslog-mode
+ `(syslog-debug ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(syslog-error ((,class :inherit bold :foreground ,red)))
+ `(syslog-file ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(syslog-hide ((,class :background ,bg-main :foreground ,fg-main)))
+ `(syslog-hour ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(syslog-info ((,class :inherit bold :foreground ,blue-alt-other)))
+ `(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)))
+;;;;; table (built-in table.el)
+ `(table-cell ((,class :background ,blue-nuanced-bg)))
+;;;;; telephone-line
+ `(telephone-line-accent-active ((,class :background ,fg-inactive :foreground ,bg-inactive)))
+ `(telephone-line-accent-inactive ((,class :background ,bg-active :foreground ,fg-active)))
+ `(telephone-line-error ((,class :inherit bold :foreground ,red-active)))
+ `(telephone-line-evil ((,class :foreground ,fg-main)))
+ `(telephone-line-evil-emacs ((,class :inherit telephone-line-evil :background ,magenta-intense-bg)))
+ `(telephone-line-evil-insert ((,class :inherit telephone-line-evil :background ,green-intense-bg)))
+ `(telephone-line-evil-motion ((,class :inherit telephone-line-evil :background ,yellow-intense-bg)))
+ `(telephone-line-evil-normal ((,class :inherit telephone-line-evil :background ,bg-alt)))
+ `(telephone-line-evil-operator ((,class :inherit telephone-line-evil :background ,yellow-subtle-bg)))
+ `(telephone-line-evil-replace ((,class :inherit telephone-line-evil :background ,red-intense-bg)))
+ `(telephone-line-evil-visual ((,class :inherit telephone-line-evil :background ,cyan-intense-bg)))
+ `(telephone-line-projectile ((,class :foreground ,cyan-active)))
+ `(telephone-line-unimportant ((,class :foreground ,fg-inactive)))
+ `(telephone-line-warning ((,class :inherit bold :foreground ,yellow-active)))
+;;;;; term
+ `(term ((,class :background ,bg-main :foreground ,fg-main)))
+ `(term-bold ((,class :inherit bold)))
+ `(term-color-blue ((,class :background ,blue :foreground ,blue)))
+ `(term-color-cyan ((,class :background ,cyan :foreground ,cyan)))
+ `(term-color-green ((,class :background ,green :foreground ,green)))
+ `(term-color-magenta ((,class :background ,magenta :foreground ,magenta)))
+ `(term-color-red ((,class :background ,red :foreground ,red)))
+ `(term-color-yellow ((,class :background ,yellow :foreground ,yellow)))
+ `(term-underline ((,class :underline t)))
+;;;;; tomatinho
+ `(tomatinho-ok-face ((,class :foreground ,blue-intense)))
+ `(tomatinho-pause-face ((,class :foreground ,yellow-intense)))
+ `(tomatinho-reset-face ((,class :foreground ,fg-alt)))
+;;;;; transient
+ `(transient-active-infix ((,class :inherit modus-theme-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-heading ((,class :inherit bold :foreground ,fg-main)))
+ `(transient-inactive-argument ((,class :foreground ,fg-alt)))
+ `(transient-inactive-value ((,class :foreground ,fg-alt)))
+ `(transient-key ((,class :inherit bold :foreground ,blue)))
+ `(transient-mismatched-key ((,class :underline t)))
+ `(transient-nonstandard-key ((,class :underline t)))
+ `(transient-pink ((,class :inherit bold :foreground ,magenta)))
+ `(transient-red ((,class :inherit bold :foreground ,red-intense)))
+ `(transient-teal ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(transient-unreachable ((,class :foreground ,fg-unfocused)))
+ `(transient-unreachable-key ((,class :foreground ,fg-unfocused)))
+ `(transient-value ((,class :foreground ,magenta-alt)))
+;;;;; trashed
+ `(trashed-deleted ((,class :inherit modus-theme-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-symlink ((,class :foreground ,cyan-alt :underline t)))
+;;;;; treemacs
+ `(treemacs-directory-collapsed-face ((,class :foreground ,magenta-alt)))
+ `(treemacs-directory-face ((,class :inherit dired-directory)))
+ `(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-ignored-face ((,class :foreground ,fg-alt)))
+ `(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 ,@(modus-operandi-theme-bold-weight) :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-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)))
+ `(treemacs-root-remote-unreadable-face ((,class :inherit treemacs-root-unreadable-face)))
+ `(treemacs-root-unreadable-face ((,class :inherit treemacs-root-face :strike-through t)))
+ `(treemacs-tags-face ((,class :foreground ,blue-alt)))
+ `(treemacs-tags-face ((,class :foreground ,magenta-alt)))
+;;;;; 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)))
+;;;;; 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)))
+ `(tuareg-font-double-semicolon-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ red-alt red-alt-faint))))
+ `(tuareg-font-lock-attribute-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(tuareg-font-lock-constructor-face ((,class :foreground ,fg-main)))
+ `(tuareg-font-lock-error-face ((,class :inherit (modus-theme-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 ,@(modus-operandi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(tuareg-font-lock-interactive-directive-face ((,class :foreground ,fg-special-cold)))
+ `(tuareg-font-lock-interactive-error-face ((,class :inherit bold
+ ,@(modus-operandi-theme-syntax-foreground
+ red red-faint))))
+ `(tuareg-font-lock-interactive-output-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(tuareg-font-lock-label-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint))))
+ `(tuareg-font-lock-line-number-face ((,class :foreground ,fg-special-warm)))
+ `(tuareg-font-lock-module-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint))))
+ `(tuareg-font-lock-multistage-face ((,class :inherit bold :background ,bg-alt
+ ,@(modus-operandi-theme-syntax-foreground
+ blue blue-faint))))
+ `(tuareg-font-lock-operator-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ red-alt red-alt-faint))))
+ `(tuareg-opam-error-face ((,class :inherit bold
+ ,@(modus-operandi-theme-syntax-foreground
+ red red-faint))))
+ `(tuareg-opam-pkg-variable-name-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan cyan-faint)
+ :slant ,modus-theme-slant)))
+;;;;; undo-tree
+ `(undo-tree-visualizer-active-branch-face ((,class :inherit bold :foreground ,fg-main)))
+ `(undo-tree-visualizer-current-face ((,class :foreground ,blue-intense)))
+ `(undo-tree-visualizer-default-face ((,class :foreground ,fg-alt)))
+ `(undo-tree-visualizer-register-face ((,class :foreground ,magenta-intense)))
+ `(undo-tree-visualizer-unmodified-face ((,class :foreground ,green-intense)))
+;;;;; vc
+ `(vc-conflict-state ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,red-active)))
+ `(vc-edited-state ((,class :foreground ,fg-special-warm)))
+ `(vc-locally-added-state ((,class :foreground ,cyan-active)))
+ `(vc-locked-state ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,magenta-active)))
+ `(vc-missing-state ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,yellow-active)))
+ `(vc-needs-update-state ((,class ,@(modus-operandi-theme-bold-weight) :foreground ,fg-special-mild)))
+ `(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 ,@(modus-operandi-theme-diffs
+ bg-main green
+ bg-diff-focus-added fg-diff-focus-added))))
+ `(vdiff-change-face ((,class ,@(modus-operandi-theme-diffs
+ bg-main yellow
+ bg-diff-focus-changed fg-diff-focus-changed))))
+ `(vdiff-closed-fold-face ((,class :background ,bg-diff-neutral-1 :foreground ,fg-diff-neutral-1)))
+ `(vdiff-refine-added ((,class ,@(modus-operandi-theme-diffs
+ bg-diff-added fg-diff-added
+ bg-diff-refine-added fg-diff-refine-added))))
+ `(vdiff-refine-changed ((,class ,@(modus-operandi-theme-diffs
+ bg-diff-changed fg-diff-changed
+ bg-diff-refine-changed fg-diff-refine-changed))))
+ `(vdiff-subtraction-face ((,class ,@(modus-operandi-theme-diffs
+ bg-main red
+ bg-diff-focus-removed fg-diff-focus-removed))))
+ `(vdiff-target-face ((,class :inherit modus-theme-intense-blue)))
+;;;;; vimish-fold
+ `(vimish-fold-fringe ((,class :foreground ,cyan-active)))
+ `(vimish-fold-mouse-face ((,class :inherit modus-theme-intense-blue)))
+ `(vimish-fold-overlay ((,class :background ,bg-alt :foreground ,fg-special-cold)))
+;;;;; visible-mark
+ `(visible-mark-active ((,class :background ,blue-intense-bg)))
+ `(visible-mark-face1 ((,class :background ,cyan-intense-bg)))
+ `(visible-mark-face2 ((,class :background ,yellow-intense-bg)))
+ `(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))))
+;;;;; volatile-highlights
+ `(vhl/default-face ((,class ,@(and (>= emacs-major-version 27) '(:extend t))
+ :background ,bg-alt :foreground ,blue-nuanced)))
+;;;;; vterm
+ `(vterm-color-black ((,class :background "black" :foreground "black")))
+ `(vterm-color-blue ((,class :background ,blue :foreground ,blue)))
+ `(vterm-color-cyan ((,class :background ,cyan :foreground ,cyan)))
+ `(vterm-color-default ((,class :background ,bg-main :foreground ,fg-main)))
+ `(vterm-color-green ((,class :background ,green :foreground ,green)))
+ `(vterm-color-inverse-video ((,class :background ,bg-main :inverse-video t)))
+ `(vterm-color-magenta ((,class :background ,magenta :foreground ,magenta)))
+ `(vterm-color-red ((,class :background ,red :foreground ,red)))
+ `(vterm-color-underline ((,class :foreground ,fg-special-warm :underline t)))
+ `(vterm-color-white ((,class :background "white" :foreground "white")))
+ `(vterm-color-yellow ((,class :background ,yellow :foreground ,yellow)))
+;;;;; wcheck-mode
+ `(wcheck-default-face ((,class :foreground ,red :underline t)))
+;;;;; web-mode
+ `(web-mode-annotation-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-annotation-html-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-annotation-tag-face ((,class :inherit web-mode-comment-face :underline t)))
+ `(web-mode-block-attr-name-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue blue-faint))))
+ `(web-mode-block-attr-value-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint))))
+ `(web-mode-block-comment-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-block-control-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(web-mode-block-delimiter-face ((,class :foreground ,fg-main)))
+ `(web-mode-block-face ((,class :background ,bg-dim)))
+ `(web-mode-block-string-face ((,class :inherit web-mode-string-face)))
+ `(web-mode-bold-face ((,class :inherit bold)))
+ `(web-mode-builtin-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(web-mode-comment-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(web-mode-comment-keyword-face ((,class :inherit bold :background ,bg-dim
+ ,@(modus-operandi-theme-syntax-foreground
+ yellow yellow-faint))))
+ `(web-mode-constant-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(web-mode-css-at-rule-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(web-mode-css-color-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(web-mode-css-comment-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-css-function-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(web-mode-css-priority-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ yellow-alt yellow-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(web-mode-css-property-name-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(web-mode-css-pseudo-class-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint))))
+ `(web-mode-css-selector-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(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 :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(web-mode-error-face ((,class :inherit modus-theme-intense-red)))
+ `(web-mode-filter-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-folded-face ((,class :underline t)))
+ `(web-mode-function-call-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-function-name-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-html-attr-custom-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(web-mode-html-attr-engine-face ((,class :foreground ,fg-main)))
+ `(web-mode-html-attr-equal-face ((,class :foreground ,fg-main)))
+ `(web-mode-html-attr-name-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(web-mode-html-attr-value-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(web-mode-html-entity-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ yellow-alt-other yellow-alt-other-faint)
+ :slant ,modus-theme-slant)))
+ `(web-mode-html-tag-bracket-face ((,class :foreground ,fg-dim)))
+ `(web-mode-html-tag-custom-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-html-tag-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-html-tag-namespaced-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(web-mode-html-tag-unclosed-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ red red-faint)
+ :underline t)))
+ `(web-mode-inlay-face ((,class :background ,bg-alt)))
+ `(web-mode-italic-face ((,class :slant italic)))
+ `(web-mode-javascript-comment-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-javascript-string-face ((,class :inherit web-mode-string-face)))
+ `(web-mode-json-comment-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-json-context-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint))))
+ `(web-mode-json-key-face ((,class :foreground ,blue-nuanced)))
+ `(web-mode-json-string-face ((,class :inherit web-mode-string-face)))
+ `(web-mode-jsx-depth-1-face ((,class :background ,blue-intense-bg :foreground ,fg-main)))
+ `(web-mode-jsx-depth-2-face ((,class :background ,blue-subtle-bg :foreground ,fg-main)))
+ `(web-mode-jsx-depth-3-face ((,class :background ,bg-special-cold :foreground ,fg-special-cold)))
+ `(web-mode-jsx-depth-4-face ((,class :background ,bg-alt :foreground ,blue-refine-fg)))
+ `(web-mode-jsx-depth-5-face ((,class :background ,bg-alt :foreground ,blue-nuanced)))
+ `(web-mode-keyword-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint)
+ ,@(modus-operandi-theme-bold-weight))))
+ `(web-mode-param-name-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-part-comment-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-part-face ((,class :inherit web-mode-block-face)))
+ `(web-mode-part-string-face ((,class :inherit web-mode-string-face)))
+ `(web-mode-preprocessor-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ red-alt-other red-alt-other-faint))))
+ `(web-mode-script-face ((,class :inherit web-mode-part-face)))
+ `(web-mode-sql-keyword-face ((,class :inherit bold
+ ,@(modus-operandi-theme-syntax-foreground
+ yellow yellow-faint))))
+ `(web-mode-string-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue-alt blue-alt-faint))))
+ `(web-mode-style-face ((,class :inherit web-mode-part-face)))
+ `(web-mode-symbol-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(web-mode-type-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint))))
+ `(web-mode-underline-face ((,class :underline t)))
+ `(web-mode-variable-name-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(web-mode-warning-face ((,class :inherit bold :background ,bg-alt
+ ,@(modus-operandi-theme-syntax-foreground
+ yellow-alt-other yellow-alt-other-faint))))
+ `(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-file-face ((,class :foreground ,fg-special-warm)))
+ `(wgrep-reject-face ((,class :inherit (modus-theme-intense-red bold))))
+;;;;; which-function-mode
+ `(which-func ((,class :foreground ,magenta-active)))
+;;;;; which-key
+ `(which-key-command-description-face ((,class :foreground ,cyan)))
+ `(which-key-group-description-face ((,class :foreground ,magenta-alt)))
+ `(which-key-highlighted-command-face ((,class :foreground ,cyan-alt :underline t)))
+ `(which-key-key-face ((,class :inherit bold :foreground ,blue-intense)))
+ `(which-key-local-map-description-face ((,class :foreground ,fg-main)))
+ `(which-key-note-face ((,class :background ,bg-dim :foreground ,fg-special-mild)))
+ `(which-key-separator-face ((,class :foreground ,fg-alt)))
+ `(which-key-special-key-face ((,class :inherit bold :foreground ,yellow-intense)))
+;;;;; whitespace-mode
+ `(whitespace-big-indent ((,class :inherit modus-theme-subtle-red)))
+ `(whitespace-empty ((,class :inherit modus-theme-intense-magenta)))
+ `(whitespace-hspace ((,class :background ,bg-whitespace :foreground ,fg-whitespace)))
+ `(whitespace-indentation ((,class :background ,bg-whitespace :foreground ,fg-whitespace)))
+ `(whitespace-line ((,class :inherit modus-theme-special-warm)))
+ `(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-tab ((,class :background ,bg-whitespace :foreground ,fg-whitespace)))
+ `(whitespace-trailing ((,class :inherit modus-theme-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 ,@(modus-operandi-theme-bold-weight) :foreground ,cyan-active)))
+;;;;; writegood-mode
+ `(writegood-duplicates-face ((,class :background ,bg-alt :foreground ,red-alt :underline t)))
+ `(writegood-passive-voice-face ((,class :foreground ,yellow-nuanced :underline ,fg-lang-warning)))
+ `(writegood-weasels-face ((,class :foreground ,red-nuanced :underline ,fg-lang-error)))
+;;;;; woman
+ `(woman-addition ((,class :foreground ,magenta-alt-other)))
+ `(woman-bold ((,class :inherit bold :foreground ,magenta)))
+ `(woman-italic ((,class :foreground ,cyan :slant italic)))
+ `(woman-unknown ((,class :foreground ,yellow :slant italic)))
+;;;;; xah-elisp-mode
+ `(xah-elisp-at-symbol ((,class :inherit bold
+ ,@(modus-operandi-theme-syntax-foreground
+ red-alt red-alt-faint))))
+ `(xah-elisp-cap-variable ((,class ,@(modus-operandi-theme-syntax-foreground
+ red-alt-other red-alt-other-faint))))
+ `(xah-elisp-command-face ((,class ,@(modus-operandi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint))))
+ `(xah-elisp-dollar-symbol ((,class ,@(modus-operandi-theme-syntax-foreground
+ green green-faint))))
+;;;;; xref
+ `(xref-file-header ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(xref-line-number ((,class :foreground ,fg-alt)))
+ `(xref-match ((,class :inherit match)))
+;;;;; yaml-mode
+ `(yaml-tab-face ((,class :inherit modus-theme-intense-red)))
+;;;;; yasnippet
+ `(yas-field-highlight-face ((,class :background ,bg-alt :foreground ,fg-main)))
+;;;;; 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-model-diff-face ((,class :foreground ,red)))
+ `(ztreep-diff-model-ignored-face ((,class :foreground ,fg-alt :strike-through t)))
+ `(ztreep-diff-model-normal-face ((,class :foreground ,fg-alt)))
+ `(ztreep-expand-sign-face ((,class :foreground ,blue)))
+ `(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)))
+ `(ztreep-node-face ((,class :foreground ,fg-main))))
+;;;; Emacs 27+
+ ;; EXPERIMENTAL this form is subject to review
+ (when (>= emacs-major-version 27)
+ (custom-theme-set-faces
+ 'modus-operandi
+;;;;; line numbers (`display-line-numbers-mode' and global variant)
+ ;; NOTE that this is specifically for the faces that were
+ ;; introduced in Emacs 27, as the other faces are already
+ ;; supported.
+ `(line-number-major-tick ((,class (:background ,yellow-nuanced-bg :foreground ,yellow-nuanced))))
+ `(line-number-minor-tick ((,class (:background ,cyan-nuanced-bg :foreground ,cyan-nuanced))))
+;;;;; tab-bar-mode
+ `(tab-bar ((,class :background ,bg-tab-bar :foreground ,fg-main)))
+ `(tab-bar-tab ((,class :inherit bold :box (:line-width 2 :color ,bg-tab-active)
+ :background ,bg-tab-active :foreground ,fg-main)))
+ `(tab-bar-tab-inactive ((,class :box (:line-width 2 :color ,bg-tab-inactive)
+ :background ,bg-tab-inactive :foreground ,fg-dim)))
+;;;;; tab-line-mode
+ `(tab-line ((,class :height 0.95 :background ,bg-tab-bar :foreground ,fg-main)))
+ `(tab-line-close-highlight ((,class :foreground ,red)))
+ `(tab-line-highlight ((,class :background ,blue-subtle-bg :foreground ,fg-dim)))
+ `(tab-line-tab ((,class :inherit bold :box (:line-width 2 :color ,bg-tab-active)
+ :background ,bg-tab-active :foreground ,fg-main)))
+ `(tab-line-tab-current ((,class :inherit tab-line-tab)))
+ `(tab-line-tab-inactive ((,class :box (:line-width 2 :color ,bg-tab-inactive)
+ :background ,bg-tab-inactive :foreground ,fg-dim)))))
+;;; variables
+ (custom-theme-set-variables
+ 'modus-operandi
+;;;; ansi-colors
+ `(ansi-color-faces-vector [default bold shadow italic underline success warning error])
+ `(ansi-color-names-vector [,fg-main ,red ,green ,yellow ,blue ,magenta ,cyan ,bg-main])
+;;;; 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))
+;;;; 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-header)
+;;;; highlight-tail
+ `(highlight-tail-colors
+ '((,green-subtle-bg . 0)
+ (,cyan-subtle-bg . 20)))
+;;;; hl-todo
+ `(hl-todo-keyword-faces
+ '(("HOLD" . ,yellow-alt)
+ ("TODO" . ,magenta)
+ ("NEXT" . ,magenta-alt-other)
+ ("THEM" . ,magenta-alt)
+ ("PROG" . ,cyan)
+ ("OKAY" . ,cyan-alt)
+ ("DONT" . ,green-alt)
+ ("FAIL" . ,red)
+ ("BUG" . ,red)
+ ("DONE" . ,green)
+ ("NOTE" . ,yellow-alt-other)
+ ("KLUDGE" . ,yellow)
+ ("HACK" . ,yellow)
+ ("TEMP" . ,red-nuanced)
+ ("FIXME" . ,red-alt-other)
+ ("XXX+" . ,red-alt)
+ ("REVIEW" . ,cyan-alt-other)
+ ("DEPRECATED" . ,blue-nuanced)))
+;;;; vc-annotate (C-x v g)
+ `(vc-annotate-background nil)
+ `(vc-annotate-background-mode nil)
+ `(vc-annotate-color-map
+ '((20 . ,red)
+ (40 . ,magenta)
+ (60 . ,magenta-alt)
+ (80 . ,red-alt)
+ (100 . ,yellow)
+ (120 . ,yellow-alt)
+ (140 . ,fg-special-warm)
+ (160 . ,fg-special-mild)
+ (180 . ,green)
+ (200 . ,green-alt)
+ (220 . ,cyan-alt-other)
+ (240 . ,cyan-alt)
+ (260 . ,cyan)
+ (280 . ,fg-special-cold)
+ (300 . ,blue)
+ (320 . ,blue-alt)
+ (340 . ,blue-alt-other)
+ (360 . ,magenta-alt-other)))
+ `(vc-annotate-very-old-color nil)
+;;;; xterm-color
+ `(xterm-color-names [,fg-main ,red ,green ,yellow ,blue ,magenta ,cyan ,bg-alt])
+ `(xterm-color-names-bright [,fg-alt ,red-alt ,green-alt ,yellow-alt ,blue-alt ,magenta-alt ,cyan-alt ,bg-main]))
+;;; Conditional theme variables
+;;;; org-src-block-faces
+ ;; this is a user option to add a colour-coded background to source
+ ;; blocks for various programming languages
+ (when (eq modus-operandi-theme-org-blocks 'rainbow)
+ (custom-theme-set-variables
+ 'modus-operandi
+ `(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)
+ ("json" modus-theme-nuanced-cyan))))))
+
+;;; library provides
+;;;###autoload
+(when load-file-name
+ (add-to-list 'custom-theme-load-path
+ (file-name-as-directory (file-name-directory load-file-name))))
+
+(provide-theme 'modus-operandi)
+
+(provide 'modus-operandi-theme)
+
+;;; modus-operandi-theme.el ends here
diff --git a/etc/themes/modus-vivendi-theme.el b/etc/themes/modus-vivendi-theme.el
new file mode 100644
index 00000000000..fa1b6be8b8e
--- /dev/null
+++ b/etc/themes/modus-vivendi-theme.el
@@ -0,0 +1,4266 @@
+;;; modus-vivendi-theme.el --- Accessible dark theme (WCAG AAA) -*- lexical-binding:t -*-
+
+;; Copyright (c) 2019-2020 Free Software Foundation, Inc.
+
+;; Author: Protesilaos Stavrou <info@protesilaos.com>
+;; URL: https://gitlab.com/protesilaos/modus-themes
+;; Version: 0.12.0
+;; Package-Requires: ((emacs "26.1"))
+;; Keywords: faces, theme, accessibility
+
+;; This file is part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; This theme is designed for colour-contrast accessibility.
+;;
+;; 1. Provide a consistent minimum contrast ratio between background and
+;; foreground values of 7:1 or higher. This meets the highest such
+;; accessibility criterion per the guidelines of the Worldwide Web
+;; Consortium's Working Group on Accessibility (WCAG AAA standard).
+;;
+;; 2. Offer as close to full face coverage as possible. The list is
+;; already quite long (see further below), with more additions to follow
+;; as part of the ongoing development process.
+;;
+;; The theme provides the following customisation options, all of which
+;; are disabled by default:
+;;
+;; modus-vivendi-theme-slanted-constructs (boolean)
+;; modus-vivendi-theme-bold-constructs (boolean)
+;; modus-vivendi-theme-variable-pitch-headings (boolean)
+;; modus-vivendi-theme-rainbow-headings (boolean)
+;; modus-vivendi-theme-section-headings (boolean)
+;; modus-vivendi-theme-scale-headings (boolean)
+;; modus-vivendi-theme-fringes (choice)
+;; modus-vivendi-theme-org-blocks (choice)
+;; modus-vivendi-theme-prompts (choice)
+;; modus-vivendi-theme-3d-modeline (boolean)
+;; modus-vivendi-theme-subtle-diffs (boolean)
+;; modus-vivendi-theme-faint-syntax (boolean)
+;; modus-vivendi-theme-intense-hl-line (boolean)
+;; modus-vivendi-theme-intense-paren-match (boolean)
+;; modus-vivendi-theme-completions (choice)
+;; modus-vivendi-theme-override-colors-alist (alist)
+;;
+;; The default scale is as follows (it can be customised as well):
+;;
+;; modus-vivendi-theme-scale-1 1.05
+;; modus-vivendi-theme-scale-2 1.1
+;; modus-vivendi-theme-scale-3 1.15
+;; modus-vivendi-theme-scale-4 1.2
+;; modus-vivendi-theme-scale-5 1.3
+;;
+;; What follows is the list of explicitly supported packages or face
+;; groups (there are implicitly supported packages as well, which
+;; inherit from font-lock or some basic group). You are encouraged to
+;; notify me of any missing package or change you would like to see.
+;;
+;; ace-window
+;; ag
+;; alert
+;; all-the-icons
+;; annotate
+;; anzu
+;; apropos
+;; apt-sources-list
+;; artbollocks-mode
+;; auctex and TeX
+;; auto-dim-other-buffers
+;; avy
+;; bm
+;; bongo
+;; boon
+;; breakpoint (provided by built-in gdb-mi.el)
+;; buffer-expose
+;; calendar and diary
+;; calfw
+;; centaur-tabs
+;; change-log and log-view (`vc-print-log' and `vc-print-root-log')
+;; cider
+;; circe
+;; color-rg
+;; column-enforce-mode
+;; company-mode
+;; company-posframe
+;; compilation-mode
+;; completions
+;; counsel
+;; counsel-css
+;; counsel-notmuch
+;; counsel-org-capture-string
+;; cov
+;; csv-mode
+;; ctrlf
+;; custom (M-x customize)
+;; dap-mode
+;; dashboard (emacs-dashboard)
+;; deadgrep
+;; debbugs
+;; define-word
+;; deft
+;; dictionary
+;; diff-hl
+;; diff-mode
+;; dim-autoload
+;; dired
+;; dired-async
+;; dired-git
+;; dired-git-info
+;; dired-narrow
+;; dired-subtree
+;; diredfl
+;; disk-usage
+;; doom-modeline
+;; dynamic-ruler
+;; easy-jekyll
+;; easy-kill
+;; ebdb
+;; ediff
+;; eglot
+;; el-search
+;; eldoc-box
+;; elfeed
+;; elfeed-score
+;; emms
+;; enhanced-ruby-mode
+;; epa
+;; equake
+;; erc
+;; eros
+;; ert
+;; eshell
+;; eshell-fringe-status
+;; eshell-git-prompt
+;; eshell-prompt-extras (epe)
+;; evil (evil-mode)
+;; evil-goggles
+;; evil-visual-mark-mode
+;; eww
+;; eyebrowse
+;; fancy-dabbrev
+;; flycheck
+;; flycheck-indicator
+;; flycheck-posframe
+;; flymake
+;; flyspell
+;; flyspell-correct
+;; flx
+;; freeze-it
+;; frog-menu
+;; focus
+;; fold-this
+;; font-lock (generic syntax highlighting)
+;; forge
+;; fountain (fountain-mode)
+;; geiser
+;; git-commit
+;; git-gutter (and variants)
+;; git-lens
+;; git-rebase
+;; git-timemachine
+;; git-walktree
+;; gnus
+;; golden-ratio-scroll-screen
+;; helm
+;; helm-ls-git
+;; helm-switch-shell
+;; helm-xref
+;; helpful
+;; highlight-blocks
+;; highlight-defined
+;; highlight-escape-sequences (`hes-mode')
+;; highlight-indentation
+;; highlight-numbers
+;; highlight-symbol
+;; highlight-tail
+;; highlight-thing
+;; hl-defined
+;; hl-fill-column
+;; hl-line-mode
+;; hl-todo
+;; hydra
+;; hyperlist
+;; ibuffer
+;; icomplete
+;; ido-mode
+;; iedit
+;; iflipb
+;; imenu-list
+;; indium
+;; info
+;; info-colors
+;; interaction-log
+;; ioccur
+;; isearch, occur, etc.
+;; ivy
+;; ivy-posframe
+;; jira (org-jira)
+;; journalctl-mode
+;; js2-mode
+;; julia
+;; jupyter
+;; kaocha-runner
+;; keycast
+;; line numbers (`display-line-numbers-mode' and global variant)
+;; lsp-mode
+;; lsp-ui
+;; magit
+;; magit-imerge
+;; man
+;; markdown-mode
+;; markup-faces (`adoc-mode')
+;; mentor
+;; messages
+;; minibuffer-line
+;; minimap
+;; modeline
+;; mood-line
+;; mu4e
+;; mu4e-conversation
+;; multiple-cursors
+;; neotree
+;; no-emoji
+;; notmuch
+;; num3-mode
+;; nxml-mode
+;; orderless
+;; org
+;; org-journal
+;; org-noter
+;; org-pomodoro
+;; org-recur
+;; org-roam
+;; org-superstar
+;; org-table-sticky-header
+;; org-treescope
+;; origami
+;; outline-mode
+;; outline-minor-faces
+;; package (M-x list-packages)
+;; page-break-lines
+;; paradox
+;; paren-face
+;; parrot
+;; pass
+;; persp-mode
+;; perspective
+;; phi-grep
+;; phi-search
+;; pkgbuild-mode
+;; pomidor
+;; powerline
+;; powerline-evil
+;; proced
+;; prodigy
+;; rainbow-blocks
+;; rainbow-identifiers
+;; rainbow-delimiters
+;; rcirc
+;; regexp-builder (also known as `re-builder')
+;; rg
+;; ripgrep
+;; rmail
+;; ruler-mode
+;; sallet
+;; selectrum
+;; semantic
+;; sesman
+;; shell-script-mode
+;; show-paren-mode
+;; side-notes
+;; skewer-mode
+;; smart-mode-line
+;; smartparens
+;; smerge
+;; spaceline
+;; speedbar
+;; spell-fu
+;; stripes
+;; suggest
+;; switch-window
+;; swiper
+;; swoop
+;; sx
+;; symbol-overlay
+;; tab-bar-mode
+;; tab-line-mode
+;; syslog-mode
+;; table (built-in table.el)
+;; telephone-line
+;; term
+;; tomatinho
+;; transient (pop-up windows like Magit's)
+;; trashed
+;; treemacs
+;; tty-menu
+;; tuareg
+;; undo-tree
+;; vc (built-in mode line status for version control)
+;; vc-annotate (C-x v g)
+;; vdiff
+;; vimish-fold
+;; visible-mark
+;; visual-regexp
+;; volatile-highlights
+;; vterm
+;; wcheck-mode
+;; web-mode
+;; wgrep
+;; which-function-mode
+;; which-key
+;; whitespace-mode
+;; window-divider-mode
+;; winum
+;; writegood-mode
+;; woman
+;; xah-elisp-mode
+;; xref
+;; xterm-color (and ansi-colors)
+;; yaml-mode
+;; yasnippet
+;; ztree
+
+;;; Code:
+
+
+
+(deftheme modus-vivendi
+ "Dark theme that conforms with the highest accessibility
+ standard for colour contrast between background and
+ foreground elements (WCAG AAA).")
+
+;;; Custom faces
+
+;; These faces will be inherited by actual constructs. They are meant
+;; for those cases where a face needs to distinguish its output from
+;; the rest of the text, such as `isearch' and `occur'… We define
+;; these separately in order to combine each colour with its
+;; appropriate foreground value. This is to ensure a consistent
+;; contrast ratio of >= 7:1.
+(defgroup modus-theme ()
+ "Theme that ensures WCAG AAA accessibility (contrast ratio
+between foreground and background is >= 7:1)."
+ :group 'faces
+ :prefix "modus-theme-"
+ :link '(url-link :tag "GitLab" "https://gitlab.com/protesilaos/modus-themes")
+ :tag "Modus Vivendi")
+
+(defface modus-theme-subtle-red nil nil)
+(defface modus-theme-subtle-green nil nil)
+(defface modus-theme-subtle-yellow nil nil)
+(defface modus-theme-subtle-blue nil nil)
+(defface modus-theme-subtle-magenta nil nil)
+(defface modus-theme-subtle-cyan nil nil)
+(defface modus-theme-subtle-neutral nil nil)
+(defface modus-theme-intense-red nil nil)
+(defface modus-theme-intense-green nil nil)
+(defface modus-theme-intense-yellow nil nil)
+(defface modus-theme-intense-blue nil nil)
+(defface modus-theme-intense-magenta nil nil)
+(defface modus-theme-intense-cyan nil nil)
+(defface modus-theme-intense-neutral nil nil)
+(defface modus-theme-refine-red nil nil)
+(defface modus-theme-refine-green nil nil)
+(defface modus-theme-refine-yellow nil nil)
+(defface modus-theme-refine-blue nil nil)
+(defface modus-theme-refine-magenta nil nil)
+(defface modus-theme-refine-cyan nil nil)
+(defface modus-theme-active-red nil nil)
+(defface modus-theme-active-green nil nil)
+(defface modus-theme-active-yellow nil nil)
+(defface modus-theme-active-blue nil nil)
+(defface modus-theme-active-magenta nil nil)
+(defface modus-theme-active-cyan nil nil)
+(defface modus-theme-fringe-red nil nil)
+(defface modus-theme-fringe-green nil nil)
+(defface modus-theme-fringe-yellow nil nil)
+(defface modus-theme-fringe-blue nil nil)
+(defface modus-theme-fringe-magenta nil nil)
+(defface modus-theme-fringe-cyan nil nil)
+(defface modus-theme-nuanced-red nil nil)
+(defface modus-theme-nuanced-green nil nil)
+(defface modus-theme-nuanced-yellow nil nil)
+(defface modus-theme-nuanced-blue nil nil)
+(defface modus-theme-nuanced-magenta nil nil)
+(defface modus-theme-nuanced-cyan nil nil)
+(defface modus-theme-special-cold nil nil)
+(defface modus-theme-special-mild nil nil)
+(defface modus-theme-special-warm nil nil)
+(defface modus-theme-special-calm nil nil)
+(defface modus-theme-diff-added nil nil)
+(defface modus-theme-diff-changed nil nil)
+(defface modus-theme-diff-removed nil nil)
+(defface modus-theme-diff-refine-added nil nil)
+(defface modus-theme-diff-refine-changed nil nil)
+(defface modus-theme-diff-refine-removed nil nil)
+(defface modus-theme-diff-focus-added nil nil)
+(defface modus-theme-diff-focus-changed nil nil)
+(defface modus-theme-diff-focus-removed nil nil)
+(defface modus-theme-diff-heading nil nil)
+(defface modus-theme-header nil nil) ; Name is tentative
+(defface modus-theme-mark-alt nil nil)
+(defface modus-theme-mark-del nil nil)
+(defface modus-theme-mark-sel nil nil)
+(defface modus-theme-mark-symbol nil nil)
+(defface modus-theme-hl-line nil nil)
+
+;;; Customisation options
+
+;; User-facing customisation options. They are all deactivated by
+;; default (users must opt in).
+(defcustom modus-vivendi-theme-slanted-constructs nil
+ "Use slanted text in more code constructs (italics or oblique)."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-bold-constructs nil
+ "Use bold text in more code constructs."
+ :type 'boolean)
+
+(define-obsolete-variable-alias 'modus-vivendi-theme-proportional-fonts
+ 'modus-vivendi-theme-variable-pitch-headings "`modus-vivendi-theme' 0.11.0")
+
+(defcustom modus-vivendi-theme-proportional-fonts nil
+ "Use proportional fonts (variable-pitch) in headings."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-variable-pitch-headings nil
+ "Use proportional fonts (variable-pitch) in headings."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-rainbow-headings nil
+ "Use more saturated colours for headings."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-section-headings nil
+ "Use a background and an overline in headings."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-scale-headings nil
+ "Use font scaling for headings."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-scale-1 1.05
+ "Font size that is slightly larger than the base value.
+The default is a floating point that is interpreted as a multiple
+of the base font size. However, the variable also accepts an
+integer, understood as an absolute height (e.g. a value of 140 is
+the same as setting the font at 14 point size).
+
+For more on the matter, read the documentation of
+`set-face-attribute', specifically the ':height' section."
+ :type 'number)
+
+(defcustom modus-vivendi-theme-scale-2 1.1
+ "Font size slightly larger than `modus-vivendi-theme-scale-1'.
+The default is a floating point that is interpreted as a multiple
+of the base font size. However, the variable also accepts an
+integer, understood as an absolute height (e.g. a value of 140 is
+the same as setting the font at 14 point size).
+
+For more on the matter, read the documentation of
+`set-face-attribute', specifically the ':height' section."
+ :type 'number)
+
+(defcustom modus-vivendi-theme-scale-3 1.15
+ "Font size slightly larger than `modus-vivendi-theme-scale-2'.
+The default is a floating point that is interpreted as a multiple
+of the base font size. However, the variable also accepts an
+integer, understood as an absolute height (e.g. a value of 140 is
+the same as setting the font at 14 point size).
+
+For more on the matter, read the documentation of
+`set-face-attribute', specifically the ':height' section."
+ :type 'number)
+
+(defcustom modus-vivendi-theme-scale-4 1.2
+ "Font size slightly larger than `modus-vivendi-theme-scale-3'.
+The default is a floating point that is interpreted as a multiple
+of the base font size. However, the variable also accepts an
+integer, understood as an absolute height (e.g. a value of 140 is
+the same as setting the font at 14 point size).
+
+For more on the matter, read the documentation of
+`set-face-attribute', specifically the ':height' section."
+ :type 'number)
+
+(defcustom modus-vivendi-theme-scale-5 1.3
+ "Font size slightly larger than `modus-vivendi-theme-scale-4'.
+The default is a floating point that is interpreted as a multiple
+of the base font size. However, the variable also accepts an
+integer, understood as an absolute height (e.g. a value of 140 is
+the same as setting the font at 14 point size).
+
+For more on the matter, read the documentation of
+`set-face-attribute', specifically the ':height' section."
+ :type 'number)
+
+(define-obsolete-variable-alias 'modus-vivendi-theme-visible-fringes
+ 'modus-vivendi-theme-fringes "`modus-vivendi-theme' 0.12.0")
+
+(defcustom modus-vivendi-theme-visible-fringes nil
+ "Use a visible style for fringes."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-fringes nil
+ "Define the visibility of fringes.
+
+Nil means the fringes have no background colour. Option `subtle'
+will apply a greyscale value that is visible yet close to the
+main buffer background colour. Option `intense' will use a more
+pronounced greyscale value."
+ :type '(choice
+ (const :tag "No visible fringes (default)" nil)
+ (const :tag "Subtle greyscale background" subtle)
+ (const :tag "Intense greyscale background" intense)))
+
+(define-obsolete-variable-alias 'modus-vivendi-theme-distinct-org-blocks
+ 'modus-vivendi-theme-org-blocks "`modus-vivendi-theme' 0.11.0")
+
+(defcustom modus-vivendi-theme-distinct-org-blocks nil
+ "Use a distinct neutral background for `org-mode' blocks."
+ :type 'boolean)
+
+(define-obsolete-variable-alias 'modus-vivendi-theme-rainbow-org-src-blocks
+ 'modus-vivendi-theme-org-blocks "`modus-vivendi-theme' 0.11.0")
+
+(defcustom modus-vivendi-theme-rainbow-org-src-blocks nil
+ "Use colour-coded backgrounds for `org-mode' source blocks.
+The colour in use depends on the language (send feedback to
+include more languages)."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-org-blocks nil
+ "Use a subtle grey or colour-coded background for Org blocks.
+
+Nil means that the block will have no background of its own and
+will use the default that applies to the rest of the buffer.
+
+Option `greyscale' will apply a subtle neutral grey background to
+the block's contents. It also affects the begin and end lines of
+the block: their background will be extended to the edge of the
+window for Emacs version >= 27 where the ':extend' keyword is
+recognised by `set-face-attribute'.
+
+Option `rainbow' will use an accented background for the contents
+of the block. The exact colour will depend on the programming
+language and is controlled by the `org-src-block-faces'
+variable (refer to the theme's source code for the current
+association list)."
+ :type '(choice
+ (const :tag "No Org block background (default)" nil)
+ (const :tag "Subtle grey block background" greyscale)
+ (const :tag "Colour-coded background per programming language" rainbow)))
+
+(defcustom modus-vivendi-theme-3d-modeline nil
+ "Use a three-dimensional style for the active mode line."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-subtle-diffs nil
+ "Use fewer/dim backgrounds in `diff-mode', `ediff',`magit'."
+ :type 'boolean)
+
+(define-obsolete-variable-alias 'modus-vivendi-theme-intense-standard-completions
+ 'modus-vivendi-theme-completions "`modus-vivendi-theme' 0.12.0")
+
+(defcustom modus-vivendi-theme-intense-standard-completions nil
+ "Use prominent backgrounds for Icomplete, Ido, or similar."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-completions nil
+ "Apply special styles to the UI of completion frameworks.
+This concerns Icomplete, Ivy, Helm, Selectrum, Ido, as well as
+any other tool meant to enhance their experience. The effect
+will vary depending on the completion framework.
+
+Nil means to remain faithful to the metaphors that each UI
+establishes. For example, Icomplete and Ido only use foreground
+colours to style their matches, whereas Ivy or Helm rely on an
+aesthetic that combines coloured backgrounds with appropriate
+text colour.
+
+Option `moderate' will apply a combination of background and
+foreground that is fairly subtle. For Icomplete and the like,
+this constitutes a departure from their standard style. While
+Ivy, Helm, and the others, will use less pronounced colours for
+applicable contexts.
+
+Option `opinionated' will apply colour combinations that
+refashion the completion UI. So Icomplete et al will now use
+styles that resemble the defaults of Ivy and co., while the
+latter group will revert to an even more nuanced aesthetic."
+ :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)))
+
+(defcustom modus-vivendi-theme-prompts nil
+ "Use subtle or intense styles for minibuffer and REPL prompts.
+
+Nil means to only use an accented foreground colour.
+
+Options `subtle' and `intense' will change both the background
+and the foreground values. The latter has a more pronounced
+effect than the former."
+ :type '(choice
+ (const :tag "No prompt background (default)" nil)
+ (const :tag "Subtle accented background for the prompt" subtle)
+ (const :tag "Intense background and foreground for the prompt" intense)))
+
+(defcustom modus-vivendi-theme-intense-hl-line nil
+ "Use more prominent background for `hl-line-mode'."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-intense-paren-match nil
+ "Use more prominent colour for parenthesis matching."
+ :type 'boolean)
+
+(defcustom modus-vivendi-theme-faint-syntax nil
+ "Use less saturated colours for code syntax highlighting."
+ :type 'boolean)
+
+;;; Internal functions
+
+;; Helper functions that are meant to ease the implementation of the
+;; above customisation options.
+(defun modus-vivendi-theme-bold-weight ()
+ "Conditional use of a heavier text weight."
+ (when modus-vivendi-theme-bold-constructs
+ (list :inherit 'bold)))
+
+(defun modus-vivendi-theme-fringe (subtlebg intensebg)
+ "Conditional use of background colours for fringes.
+SUBTLEBG should be a subtle greyscale value. INTENSEBG must be a
+more pronounced greyscale colour."
+ (pcase modus-vivendi-theme-fringes
+ ('intense (list :background intensebg))
+ ('subtle (list :background subtlebg))
+ (_ (list :background nil))))
+
+(defun modus-vivendi-theme-prompt (mainfg subtlebg subtlefg intensebg intensefg)
+ "Conditional use of background colours for prompts.
+MAINFG is the prompt's standard foreground. SUBTLEBG should be a
+subtle accented background that works with SUBTLEFG. INTENSEBG
+must be a more pronounced accented colour that should be
+combinable with INTENSEFG."
+ (pcase modus-vivendi-theme-prompts
+ ('intense (list :background intensebg :foreground intensefg))
+ ('subtle (list :background subtlebg :foreground subtlefg))
+ (_ (list :background nil :foreground mainfg))))
+
+(defun modus-vivendi-theme-paren (normalbg intensebg)
+ "Conditional use of intense colours for matching parentheses.
+NORMALBG should the special palette colour 'bg-paren-match' or
+something similar. INTENSEBG must be easier to discern next to
+other backgrounds, such as the special palette colour
+'bg-paren-match-intense'."
+ (if modus-vivendi-theme-intense-paren-match
+ (list :background intensebg)
+ (list :background normalbg)))
+
+(defun modus-vivendi-theme-syntax-foreground (normal faint)
+ "Apply foreground value to code syntax.
+NORMAL is the more saturated colour, which should be the default.
+FAINT is the less saturated colour."
+ (if modus-vivendi-theme-faint-syntax
+ (list :foreground faint)
+ (list :foreground normal)))
+
+(defun modus-vivendi-theme-heading-foreground (subtle rainbow)
+ "Apply foreground value to headings.
+SUBTLE is the default aesthetic. RAINBOW is the saturated one."
+ (if modus-vivendi-theme-rainbow-headings
+ (list :foreground rainbow)
+ (list :foreground subtle)))
+
+(defun modus-vivendi-theme-heading-block (bg fg)
+ "Conditionally extend heading styles.
+Apply BG to background and FG to overline."
+ (if modus-vivendi-theme-section-headings
+ (append
+ (and (>= emacs-major-version 27) '(:extend t))
+ (list :background bg :overline fg))
+ (list :background nil :overline nil)))
+
+(defun modus-vivendi-theme-org-todo-block (bgbox fgbox fg)
+ "Conditionally extend the styles of Org keywords.
+BGBOX applies to the background. FGBOX applies to the foreground
+and the border. FG is used when no block style is in effect."
+ (if modus-vivendi-theme-section-headings
+ (list :background bgbox :foreground fgbox :box (list :color fgbox))
+ (list :foreground fg)))
+
+(defun modus-vivendi-theme-org-block (bgblk)
+ "Conditionally set the background of Org blocks.
+BGBLK applies to a distinct neutral background. Else blocks have
+no background of their own (the default), so they look the same
+as the rest of the buffer.
+
+`modus-vivendi-theme-org-blocks' also accepts a `rainbow' option
+which is applied conditionally to `org-src-block-faces' (see the
+theme's source code)."
+ (if (eq modus-vivendi-theme-org-blocks 'greyscale)
+ (append
+ (and (>= emacs-major-version 27) '(:extend t))
+ (list :background bgblk))
+ (list :background nil)))
+
+(defun modus-vivendi-theme-org-block-delim (bgaccent fgaccent bg fg)
+ "Conditionally set the styles of Org block delimiters.
+BG, FG, BGACCENT, FGACCENT apply a background and foreground
+colour respectively.
+
+The former pair is a greyscale combination that should be more
+distinct than the background of the block. It is applied to the
+default styles or when `modus-vivendi-theme-org-blocks' is set
+to `greyscale'.
+
+The latter pair should be more subtle than the background of the
+block, as it is used when `modus-vivendi-theme-org-blocks' is
+set to `rainbow'."
+ (pcase modus-vivendi-theme-org-blocks
+ ('greyscale (append (and (>= emacs-major-version 27) '(:extend t))
+ (list :background bg :foreground fg)))
+ ('rainbow (list :background bgaccent :foreground fgaccent))
+ (_ (list :background bg :foreground fg))))
+
+(defun modus-vivendi-theme-modeline-box (col3d col &optional btn int)
+ "Control the box properties of the mode line.
+COL3D is the border that is intended for the three-dimensional
+modeline. COL applies to the two-dimensional modeline. Optional
+BTN provides the 3d button style. Optional INT defines a border
+width."
+ (let* ((style (if btn 'released-button nil))
+ (int (if int int 1)))
+ (if modus-vivendi-theme-3d-modeline
+ (list :line-width int :color col3d :style style)
+ (list :line-width 1 :color col :style nil))))
+
+(defun modus-vivendi-theme-modeline-props (bg3d fg3d &optional bg fg)
+ "Control the background and foreground of the mode line.
+BG is the modeline's background. FG is the modeline's
+foreground. BG3D and FG3D apply to the three-dimensional
+modeline style."
+ (if modus-vivendi-theme-3d-modeline
+ (list :background bg3d :foreground fg3d)
+ (list :background bg :foreground fg)))
+
+(defun modus-vivendi-theme-diffs (subtle-bg subtle-fg intense-bg intense-fg)
+ "Colour combinations for `modus-vivendi-theme-subtle-diffs'.
+
+SUBTLE-BG should be similar or the same as the main background.
+SUBTLE-FG should be an appropriate accent value. INTENSE-BG
+should be one of the dedicated backgrounds for diffs. INTENSE-FG
+should be one of the dedicated foregrounds for diffs"
+ (if modus-vivendi-theme-subtle-diffs
+ (list :background subtle-bg :foreground subtle-fg)
+ (list :background intense-bg :foreground intense-fg)))
+
+(defun modus-vivendi-theme-standard-completions (mainfg subtlebg intensebg intensefg)
+ "Combinations for `modus-vivendi-theme-completions'.
+These are intended for Icomplete, Ido, and related.
+
+MAINFG is an accented foreground value. SUBTLEBG is an accented
+background value that can be combined with MAINFG. INTENSEBG and
+INTENSEFG are accented colours that are designed to be used in
+tandem."
+ (pcase modus-vivendi-theme-completions
+ ('opinionated (list :background intensebg :foreground intensefg))
+ ('moderate (list :background subtlebg :foreground mainfg))
+ (_ (list :foreground mainfg))))
+
+(defun modus-vivendi-theme-extra-completions (subtleface intenseface altface &optional altfg bold)
+ "Combinations for `modus-vivendi-theme-completions'.
+These are intended for Helm, Ivy, Selectrum, etc.
+
+SUBTLEFACE and INTENSEFACE are custom theme faces that combine a
+background and foreground value. The difference between the two
+is a matter of degree.
+
+ALTFACE is a combination of colours that represents a departure
+from the UI's default aesthetics. Optional ALTFG is meant to be
+used in tandem with it.
+
+Optional BOLD will apply a heavier weight to the text."
+ (pcase modus-vivendi-theme-completions
+ ('opinionated (list :inherit (list altface bold)
+ :foreground (if altfg altfg 'unspecified)))
+ ('moderate (list :inherit (list subtleface bold)))
+ (_ (list :inherit (list intenseface bold)))))
+
+(defun modus-vivendi-theme-scale (amount)
+ "Scale heading by AMOUNT.
+
+AMOUNT is a customisation option."
+ (when modus-vivendi-theme-scale-headings
+ (list :height amount)))
+
+;;; Colour palette
+
+;; Define colour palette. Each colour must have a >= 7:1 contrast
+;; ratio relative to the foreground/background colour it is rendered
+;; against.
+;;
+;; The design of the colour palette as a macro that maps it to faces is
+;; adapted from zenbern-theme.el, last seen at commit 7dd7968:
+;; https://github.com/bbatsov/zenburn-emacs
+(eval-and-compile
+ (defconst modus-vivendi-theme-default-colors-alist
+ '(;; base values
+ ("bg-main" . "#000000") ("fg-main" . "#ffffff")
+ ("bg-alt" . "#181a20") ("fg-alt" . "#a8a8a8")
+ ("bg-dim" . "#110b11") ("fg-dim" . "#e0e6f0")
+ ;; specifically for on/off states (e.g. `mode-line')
+ ;;
+ ;; must be combined with themselves
+ ("bg-active" . "#2f2f2f") ("fg-active" . "#f5f5f5")
+ ("bg-inactive" . "#202020") ("fg-inactive" . "#bebebe")
+ ;; special base values, used only for cases where the above
+ ;; fg-* or bg-* cannot or should not be used (to avoid confusion)
+ ;; must be combined with: {fg,bg}-{main,alt,dim}
+ ("bg-special-cold" . "#203448") ("fg-special-cold" . "#c6eaff")
+ ("bg-special-mild" . "#00322e") ("fg-special-mild" . "#bfebe0")
+ ("bg-special-warm" . "#382f27") ("fg-special-warm" . "#f8dec0")
+ ("bg-special-calm" . "#392a48") ("fg-special-calm" . "#fbd6f4")
+ ;; styles for the main constructs
+ ;;
+ ;; must be combined with: `bg-main', `bg-alt', `bg-dim'
+ ("red" . "#ff8059") ("green" . "#44bc44")
+ ("yellow" . "#eecc00") ("blue" . "#29aeff")
+ ("magenta" . "#feacd0") ("cyan" . "#00d3d0")
+ ;; styles for common, but still specialised constructs
+ ;;
+ ;; must be combined with: `bg-main', `bg-alt', `bg-dim'
+ ("red-alt" . "#f4923b") ("green-alt" . "#80d200")
+ ("yellow-alt" . "#cfdf30") ("blue-alt" . "#72a4ff")
+ ("magenta-alt" . "#f78fe7") ("cyan-alt" . "#4ae8fc")
+ ;; same purpose as above, just slight differences
+ ;;
+ ;; must be combined with: `bg-main', `bg-alt', `bg-dim'
+ ("red-alt-other" . "#ff9977") ("green-alt-other" . "#00cd68")
+ ("yellow-alt-other" . "#f0ce43") ("blue-alt-other" . "#00bdfa")
+ ("magenta-alt-other" . "#b6a0ff") ("cyan-alt-other" . "#6ae4b9")
+ ;; styles for desaturated foreground text, intended for use with
+ ;; the `modus-vivendi-theme-faint-syntax' option
+ ;;
+ ;; must be combined with: `bg-main', `bg-alt', `bg-dim'
+ ("red-faint" . "#ffa0a0") ("green-faint" . "#88cf88")
+ ("yellow-faint" . "#d2b580") ("blue-faint" . "#92baff")
+ ("magenta-faint" . "#e0b2d6") ("cyan-faint" . "#a0bfdf")
+
+ ("red-alt-faint" . "#f5aa80") ("green-alt-faint" . "#a8cf88")
+ ("yellow-alt-faint" . "#cabf77") ("blue-alt-faint" . "#a4b0ff")
+ ("magenta-alt-faint" . "#ef9fe4") ("cyan-alt-faint" . "#90c4ed")
+
+ ("red-alt-other-faint" . "#ff9fbf") ("green-alt-other-faint" . "#88cfaf")
+ ("yellow-alt-other-faint" . "#d0ba95") ("blue-alt-other-faint" . "#8fc5ff")
+ ("magenta-alt-other-faint" . "#d0b4ff") ("cyan-alt-other-faint" . "#a4d0bb")
+ ;; styles for elements that should be very subtle, yet accented
+ ;;
+ ;; must be combined with: `bg-main', `bg-alt', `bg-dim' or any of
+ ;; the "nuanced" backgrounds
+ ("red-nuanced" . "#ffcccc") ("green-nuanced" . "#b8e2b8")
+ ("yellow-nuanced" . "#dfdfb0") ("blue-nuanced" . "#bfd9ff")
+ ("magenta-nuanced" . "#e5cfef") ("cyan-nuanced" . "#a8e5e5")
+ ;; styles for slightly accented background
+ ;;
+ ;; must be combined with any of the above foreground values
+ ("red-nuanced-bg" . "#2c0614") ("green-nuanced-bg" . "#001904")
+ ("yellow-nuanced-bg" . "#221000") ("blue-nuanced-bg" . "#0f0e39")
+ ("magenta-nuanced-bg" . "#230631") ("cyan-nuanced-bg" . "#041529")
+ ;; styles for elements that should draw attention to themselves
+ ;;
+ ;; must be combined with: `bg-main'
+ ("red-intense" . "#fb6859") ("green-intense" . "#00fc50")
+ ("yellow-intense" . "#ffdd00") ("blue-intense" . "#00a2ff")
+ ("magenta-intense" . "#ff8bd4") ("cyan-intense" . "#30ffc0")
+ ;; styles for background elements that should be visible yet
+ ;; subtle
+ ;;
+ ;; must be combined with: `fg-dim'
+ ("red-subtle-bg" . "#762422") ("green-subtle-bg" . "#2f4a00")
+ ("yellow-subtle-bg" . "#604200") ("blue-subtle-bg" . "#10387c")
+ ("magenta-subtle-bg" . "#49366e") ("cyan-subtle-bg" . "#00415e")
+ ;; styles for background elements that should be visible and
+ ;; distinguishable
+ ;;
+ ;; must be combined with: `fg-main'
+ ("red-intense-bg" . "#a4202a") ("green-intense-bg" . "#006800")
+ ("yellow-intense-bg" . "#874900") ("blue-intense-bg" . "#2a40b8")
+ ("magenta-intense-bg" . "#7042a2") ("cyan-intense-bg" . "#005f88")
+ ;; styles for refined contexts where both the foreground and the
+ ;; background need to have the same/similar hue
+ ;;
+ ;; must be combined with themselves OR the foregrounds can be
+ ;; combined with any of the base backgrounds
+ ("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")
+ ("magenta-refine-bg" . "#71206a") ("magenta-refine-fg" . "#ffcaf0")
+ ("cyan-refine-bg" . "#004065") ("cyan-refine-fg" . "#8ae4f2")
+ ;; styles that are meant exclusively for the mode line
+ ;;
+ ;; must be combined with: `bg-active', `bg-inactive'
+ ("red-active" . "#ffa49e") ("green-active" . "#70e030")
+ ("yellow-active" . "#efdf00") ("blue-active" . "#00ccff")
+ ("magenta-active" . "#d0acff") ("cyan-active" . "#00ddc0")
+ ;; styles that are meant exclusively for the fringes
+ ;;
+ ;; must have a minimum contrast ratio of 1.5:1 with `bg-inactive'
+ ;; and be combined with `fg-main' or `fg-dim'
+ ("red-fringe-bg" . "#8f0040") ("green-fringe-bg" . "#006000")
+ ("yellow-fringe-bg" . "#6f4a00") ("blue-fringe-bg" . "#3a30ab")
+ ("magenta-fringe-bg" . "#692089") ("cyan-fringe-bg" . "#0068a0")
+ ;; styles reserved for specific faces
+ ;;
+ ;; `bg-hl-line' is between `bg-dim' and `bg-alt', so it should
+ ;; work with all accents that cover those two, plus `bg-main'
+ ;;
+ ;; `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 colours
+ ;;
+ ;; `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'
+ ;;
+ ;; `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',
+ ;; though only for styling special elements, such as underlining
+ ;; the current tab
+ ;;
+ ;; `fg-escape-char-construct' and `fg-escape-char-backslash' can
+ ;; be combined `bg-main', `bg-dim', `bg-alt'
+ ;;
+ ;; `fg-lang-error', `fg-lang-warning', `fg-lang-note' can be
+ ;; combined with `bg-main', `bg-dim', `bg-alt'
+ ;;
+ ;; `fg-mark-sel', `fg-mark-del', `fg-mark-alt' can be combined
+ ;; with `bg-main', `bg-dim', `bg-alt', `bg-hl-line'
+ ;;
+ ;; `fg-unfocused' must be combined with `fg-main'
+ ;;
+ ;; the window divider colours apply to faces with just an fg value
+ ;;
+ ;; all pairs are combinable with themselves
+ ("bg-hl-line" . "#151823")
+ ("bg-paren-match" . "#5f362f")
+ ("bg-paren-match-intense" . "#255650")
+ ("bg-region" . "#3c3c3c")
+
+ ("bg-tab-bar" . "#2c2c2c")
+ ("bg-tab-active" . "#0e0e0e")
+ ("bg-tab-inactive" . "#3d3d3d")
+ ("fg-tab-active" . "#5ac3cf")
+
+ ("fg-escape-char-construct" . "#e7a59a")
+ ("fg-escape-char-backslash" . "#abab00")
+
+ ("fg-lang-error" . "#ef8690")
+ ("fg-lang-warning" . "#b0aa00")
+ ("fg-lang-note" . "#9d9def")
+
+ ("fg-window-divider-inner" . "#646464")
+ ("fg-window-divider-outer" . "#969696")
+
+ ("fg-unfocused" . "#93959b")
+
+ ("bg-header" . "#212121") ("fg-header" . "#dddddd")
+
+ ("bg-whitespace" . "#170016") ("fg-whitespace" . "#a4959f")
+
+ ("bg-diff-heading" . "#304466") ("fg-diff-heading" . "#dadffe")
+ ("bg-diff-added" . "#0a280a") ("fg-diff-added" . "#94ba94")
+ ("bg-diff-changed" . "#2a2000") ("fg-diff-changed" . "#b0ba9f")
+ ("bg-diff-removed" . "#40160f") ("fg-diff-removed" . "#c6adaa")
+
+ ("bg-diff-refine-added" . "#005a36") ("fg-diff-refine-added" . "#e0f6e0")
+ ("bg-diff-refine-changed" . "#585800") ("fg-diff-refine-changed" . "#ffffcc")
+ ("bg-diff-refine-removed" . "#852828") ("fg-diff-refine-removed" . "#ffd9eb")
+
+ ("bg-diff-focus-added" . "#203d20") ("fg-diff-focus-added" . "#b4ddb4")
+ ("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"))
+ "The entire palette of `modus-vivendi-theme'.
+Each element has the form (NAME . HEX).")
+
+ (defcustom modus-vivendi-theme-override-colors-alist '()
+ "Association list of palette colour overrides.
+Values can be mapped to variables, using the same syntax as the
+one present in `modus-vivendi-theme-default-colors-alist'.
+
+This is only meant for do-it-yourself usage, with the
+understanding that the user is responsible for the resulting
+contrast ratio between new and existing colours."
+ :type '(alist
+ :key-type (string :tag "Name")
+ :value-type (string :tag " Hex")))
+
+ (defmacro modus-vivendi-theme-with-color-variables (&rest body)
+ "`let' bind all colours around BODY.
+Also bind `class' to ((class color) (min-colors 89))."
+ (declare (indent 0))
+ `(let ((class '((class color) (min-colors 89)))
+ ,@(mapcar (lambda (cons)
+ (list (intern (car cons)) (cdr cons)))
+ (append modus-vivendi-theme-default-colors-alist
+ modus-vivendi-theme-override-colors-alist))
+ ;; simple conditional styles that evaluate user-facing
+ ;; customisation options
+ (modus-theme-slant
+ (if modus-vivendi-theme-slanted-constructs 'italic 'normal))
+ (modus-theme-variable-pitch
+ (if modus-vivendi-theme-variable-pitch-headings 'variable-pitch 'default)))
+ ,@body)))
+
+
+
+;;; Faces
+
+(modus-vivendi-theme-with-color-variables
+ (custom-theme-set-faces
+ 'modus-vivendi
+;;;; custom faces
+ ;; these bespoke faces are inherited by other constructs below
+;;;;; subtle coloured 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)))
+;;;;; intense coloured 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)))
+;;;;; 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)))
+;;;;; "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)))
+;;;;; nuanced backgrounds
+ ;; useful for adding an accented background that is suitable for all
+ ;; main foreground colours (intended for use in Org source blocks)
+ `(modus-theme-nuanced-red ((,class :background ,red-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(modus-theme-nuanced-green ((,class :background ,green-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(modus-theme-nuanced-yellow ((,class :background ,yellow-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(modus-theme-nuanced-blue ((,class :background ,blue-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(modus-theme-nuanced-magenta ((,class :background ,magenta-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(modus-theme-nuanced-cyan ((,class :background ,cyan-nuanced-bg
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+;;;;; fringe-specific combinations
+ `(modus-theme-fringe-red ((,class :background ,red-fringe-bg :foreground ,fg-dim)))
+ `(modus-theme-fringe-green ((,class :background ,green-fringe-bg :foreground ,fg-dim)))
+ `(modus-theme-fringe-yellow ((,class :background ,yellow-fringe-bg :foreground ,fg-dim)))
+ `(modus-theme-fringe-blue ((,class :background ,blue-fringe-bg :foreground ,fg-dim)))
+ `(modus-theme-fringe-magenta ((,class :background ,magenta-fringe-bg :foreground ,fg-dim)))
+ `(modus-theme-fringe-cyan ((,class :background ,cyan-fringe-bg :foreground ,fg-dim)))
+;;;;; 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)))
+;;;;; diff-specific combinations
+ ;; intended for `diff-mode' or equivalent
+ `(modus-theme-diff-added ((,class :background ,bg-diff-added :foreground ,fg-diff-added)))
+ `(modus-theme-diff-changed ((,class :background ,bg-diff-changed :foreground ,fg-diff-changed)))
+ `(modus-theme-diff-removed ((,class :background ,bg-diff-removed :foreground ,fg-diff-removed)))
+ `(modus-theme-diff-refine-added ((,class :background ,bg-diff-refine-added :foreground ,fg-diff-refine-added)))
+ `(modus-theme-diff-refine-changed ((,class :background ,bg-diff-refine-changed :foreground ,fg-diff-refine-changed)))
+ `(modus-theme-diff-refine-removed ((,class :background ,bg-diff-refine-removed :foreground ,fg-diff-refine-removed)))
+ `(modus-theme-diff-focus-added ((,class :background ,bg-diff-focus-added :foreground ,fg-diff-focus-added)))
+ `(modus-theme-diff-focus-changed ((,class :background ,bg-diff-focus-changed :foreground ,fg-diff-focus-changed)))
+ `(modus-theme-diff-focus-removed ((,class :background ,bg-diff-focus-removed :foreground ,fg-diff-focus-removed)))
+ `(modus-theme-diff-heading ((,class :background ,bg-diff-heading :foreground ,fg-diff-heading)))
+;;;;; mark indicators
+ ;; colour combinations intended for Dired, Ibuffer, or equivalent
+ `(modus-theme-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)))
+;;;;; other custom faces
+ `(modus-theme-hl-line ((,class :background ,(if modus-vivendi-theme-intense-hl-line
+ bg-active bg-hl-line)
+ (and (>= emacs-major-version 27) '(:extend t)))))
+;;;; standard faces
+;;;;; absolute essentials
+ `(default ((,class :background ,bg-main :foreground ,fg-main)))
+ `(cursor ((,class :background ,fg-main)))
+ `(fringe ((,class ,@(modus-vivendi-theme-fringe bg-inactive bg-active)
+ :foreground ,fg-main)))
+ `(vertical-border ((,class :foreground ,fg-window-divider-inner)))
+;;;;; basic and/or ungrouped styles
+ ;; Modify the `bold' face to change the weight of all "bold" elements
+ ;; defined by the theme. You need a typeface that supports a
+ ;; multitude of heavier weights than the regular one and then you
+ ;; must specify the exact name of the one you wish to apply. Example
+ ;; for your init.el:
+ ;;
+ ;; (set-face-attribute 'bold nil :weight 'semibold)
+ `(bold ((,class :weight bold)))
+ `(comint-highlight-input ((,class :inherit bold)))
+ `(comint-highlight-prompt ((,class ,@(modus-vivendi-theme-bold-weight)
+ ,@(modus-vivendi-theme-prompt cyan
+ blue-nuanced-bg
+ blue-alt
+ blue-refine-bg
+ fg-main))))
+ `(error ((,class :inherit bold :foreground ,red)))
+ `(escape-glyph ((,class :foreground ,fg-escape-char-construct)))
+ `(file-name-shadow ((,class :foreground ,fg-unfocused)))
+ `(header-line ((,class :background ,bg-header :foreground ,fg-header)))
+ `(header-line-highlight ((,class :inherit modus-theme-active-blue)))
+ `(homoglyph ((,class :foreground ,fg-escape-char-construct)))
+ `(ibuffer-locked-buffer ((,class :foreground ,yellow-alt-other)))
+ `(italic ((,class :slant italic)))
+ `(nobreak-hyphen ((,class :foreground ,fg-escape-char-construct)))
+ `(nobreak-space ((,class :foreground ,fg-escape-char-construct :underline t)))
+ `(minibuffer-prompt ((,class ,@(modus-vivendi-theme-prompt cyan-alt-other
+ cyan-nuanced-bg
+ cyan
+ 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 :background ,bg-region :foreground ,fg-main)))
+ `(secondary-selection ((,class :inherit modus-theme-special-cold)))
+ `(shadow ((,class :foreground ,fg-alt)))
+ `(success ((,class :inherit bold :foreground ,green)))
+ `(trailing-whitespace ((,class :background ,red-intense-bg)))
+ `(warning ((,class :inherit bold :foreground ,yellow)))
+;;;;; buttons, links, widgets
+ `(button ((,class :foreground ,blue-alt-other :underline t)))
+ `(link ((,class :foreground ,blue-alt-other :underline t)))
+ `(link-visited ((,class :foreground ,magenta-alt-other :underline t)))
+ `(tooltip ((,class :background ,bg-special-cold :foreground ,fg-main)))
+ `(widget-button ((,class :inherit button)))
+ `(widget-button-pressed ((,class :inherit button :foreground ,magenta)))
+ `(widget-documentation ((,class :foreground ,green)))
+ `(widget-field ((,class :background ,bg-alt :foreground ,fg-dim)))
+ `(widget-inactive ((,class :background ,bg-inactive :foreground ,fg-inactive)))
+ `(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)))
+;;;;; alert
+ `(alert-high-face ((,class :inherit bold :foreground ,red-alt)))
+ `(alert-low-face ((,class :foreground ,fg-special-mild)))
+ `(alert-moderate-face ((,class :inherit bold :foreground ,yellow)))
+ `(alert-trivial-face ((,class :foreground ,fg-special-calm)))
+ `(alert-urgent-face ((,class :inherit bold :foreground ,red-intense)))
+;;;;; all-the-icons
+ `(all-the-icons-blue ((,class :foreground ,blue)))
+ `(all-the-icons-blue-alt ((,class :foreground ,blue-alt)))
+ `(all-the-icons-cyan ((,class :foreground ,cyan)))
+ `(all-the-icons-cyan-alt ((,class :foreground ,cyan-alt)))
+ `(all-the-icons-dblue ((,class :foreground ,blue-alt-other)))
+ `(all-the-icons-dcyan ((,class :foreground ,cyan-alt-other)))
+ `(all-the-icons-dgreen ((,class :foreground ,green-alt-other)))
+ `(all-the-icons-dired-dir-face ((,class :foreground ,blue)))
+ `(all-the-icons-dmaroon ((,class :foreground ,magenta-alt-other)))
+ `(all-the-icons-dorange ((,class :foreground ,red-alt-other)))
+ `(all-the-icons-dpink ((,class :foreground ,magenta)))
+ `(all-the-icons-dpurple ((,class :foreground ,magenta-alt)))
+ `(all-the-icons-dred ((,class :foreground ,red)))
+ `(all-the-icons-dsilver ((,class :foreground ,fg-special-cold)))
+ `(all-the-icons-dyellow ((,class :foreground ,yellow)))
+ `(all-the-icons-green ((,class :foreground ,green)))
+ `(all-the-icons-lblue ((,class :foreground ,blue-refine-fg)))
+ `(all-the-icons-lcyan ((,class :foreground ,cyan-refine-fg)))
+ `(all-the-icons-lgreen ((,class :foreground ,green-refine-fg)))
+ `(all-the-icons-lmaroon ((,class :foreground ,magenta-refine-fg)))
+ `(all-the-icons-lorange ((,class :foreground ,red-refine-fg)))
+ `(all-the-icons-lpink ((,class :foreground ,magenta-refine-fg)))
+ `(all-the-icons-lpurple ((,class :foreground ,magenta-refine-fg)))
+ `(all-the-icons-lred ((,class :foreground ,red-refine-fg)))
+ `(all-the-icons-lsilver ((,class :foreground ,fg-special-cold)))
+ `(all-the-icons-lyellow ((,class :foreground ,yellow-refine-fg)))
+ `(all-the-icons-maroon ((,class :foreground ,magenta)))
+ `(all-the-icons-orange ((,class :foreground ,red-alt)))
+ `(all-the-icons-pink ((,class :foreground ,magenta)))
+ `(all-the-icons-purple ((,class :foreground ,magenta-alt)))
+ `(all-the-icons-purple-alt ((,class :foreground ,magenta-alt-other)))
+ `(all-the-icons-red ((,class :foreground ,red)))
+ `(all-the-icons-red-alt ((,class :foreground ,red-alt)))
+ `(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-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-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))))
+;;;;; apropos
+ `(apropos-function-button ((,class :foreground ,magenta-alt-other :underline t)))
+ `(apropos-keybinding ((,class :inherit bold :foreground ,cyan)))
+ `(apropos-misc-button ((,class :foreground ,cyan-alt-other :underline t)))
+ `(apropos-property ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,magenta-alt)))
+ `(apropos-symbol ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,blue-nuanced :underline t)))
+ `(apropos-user-option-button ((,class :foreground ,green-alt-other :underline t)))
+ `(apropos-variable-button ((,class :foreground ,blue :underline t)))
+;;;;; apt-sources-list
+ `(apt-sources-list-components ((,class :foreground ,cyan)))
+ `(apt-sources-list-options ((,class :foreground ,yellow)))
+ `(apt-sources-list-suite ((,class :foreground ,green)))
+ `(apt-sources-list-type ((,class :foreground ,magenta)))
+ `(apt-sources-list-uri ((,class :foreground ,blue)))
+;;;;; artbollocks-mode
+ `(artbollocks-face ((,class :foreground ,cyan-nuanced :underline ,fg-lang-note)))
+ `(artbollocks-lexical-illusions-face ((,class :background ,bg-alt :foreground ,red-alt :underline t)))
+ `(artbollocks-passive-voice-face ((,class :foreground ,yellow-nuanced :underline ,fg-lang-warning)))
+ `(artbollocks-weasel-words-face ((,class :foreground ,red-nuanced :underline ,fg-lang-error)))
+;;;;; auctex and Tex
+ `(font-latex-bold-face ((,class :inherit bold :foreground ,fg-special-calm)))
+ `(font-latex-doctex-documentation-face ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(font-latex-doctex-preprocessor-face ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,red-alt-other)))
+ `(font-latex-italic-face ((,class :foreground ,fg-special-calm :slant italic)))
+ `(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)))
+ `(font-latex-sectioning-1-face ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,blue-nuanced)))
+ `(font-latex-sectioning-2-face ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,blue-nuanced)))
+ `(font-latex-sectioning-3-face ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,blue-nuanced)))
+ `(font-latex-sectioning-4-face ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,blue-nuanced)))
+ `(font-latex-sectioning-5-face ((,class :inherit ,modus-theme-variable-pitch :foreground ,blue-nuanced)))
+ `(font-latex-sedate-face ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,magenta-alt-other)))
+ `(font-latex-slide-title-face ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,cyan-nuanced
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4))))
+ `(font-latex-string-face ((,class :foreground ,blue-alt)))
+ `(font-latex-subscript-face ((,class :height 0.95)))
+ `(font-latex-superscript-face ((,class :height 0.95)))
+ `(font-latex-verbatim-face ((,class :background ,bg-dim :foreground ,fg-special-mild)))
+ `(font-latex-warning-face ((,class :foreground ,yellow-alt-other)))
+ `(tex-match ((,class :foreground ,blue-alt-other)))
+ `(tex-verbatim ((,class :background ,bg-dim :foreground ,fg-special-mild)))
+ `(texinfo-heading ((,class :foreground ,magenta)))
+ `(TeX-error-description-error ((,class :inherit bold :foreground ,red)))
+ `(TeX-error-description-help ((,class :foreground ,blue)))
+ `(TeX-error-description-tex-said ((,class :foreground ,blue)))
+ `(TeX-error-description-warning ((,class :inherit bold :foreground ,yellow)))
+;;;;; 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))))
+;;;;; 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 :background ,bg-main :foreground ,red-intense)))
+ `(aw-minibuffer-leading-char-face ((,class :foreground ,magenta-active)))
+ `(aw-mode-line-face ((,class :inherit bold)))
+;;;;; bm
+ `(bm-face ((,class :inherit modus-theme-subtle-yellow
+ ,@(and (>= emacs-major-version 27) '(: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
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+;;;;; bongo
+ `(bongo-album-title ((,class :foreground ,cyan-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-filled-seek-bar ((,class :background ,blue-subtle-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 ,blue-alt-other)))
+ `(bongo-track-title ((,class :foreground ,blue-active)))
+ `(bongo-unfilled-seek-bar ((,class :background ,blue-nuanced-bg :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)))
+;;;;; breakpoint (built-in gdb-mi.el)
+ `(breakpoint-disabled ((,class :foreground ,fg-alt)))
+ `(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)))
+;;;;; calendar and diary
+ `(calendar-month-header ((,class :inherit bold :foreground ,fg-main)))
+ `(calendar-today ((,class :underline t)))
+ `(calendar-weekday-header ((,class :foreground ,fg-dim)))
+ `(calendar-weekend-header ((,class :foreground ,fg-alt)))
+ `(diary ((,class :foreground ,cyan-alt-other)))
+ `(diary-anniversary ((,class :foreground ,red-alt-other)))
+ `(diary-time ((,class :foreground ,blue-alt)))
+ `(holiday ((,class :foreground ,magenta-alt)))
+;;;;; calfw
+ `(cfw:face-annotation ((,class :background ,bg-alt :foreground ,fg-alt)))
+ `(cfw:face-day-title ((,class :background ,bg-alt :foreground ,fg-main)))
+ `(cfw:face-default-content ((,class :foreground ,green-alt)))
+ `(cfw:face-default-day ((,class :inherit (cfw:face-day-title bold))))
+ `(cfw:face-disable ((,class :background ,bg-inactive :foreground ,fg-inactive)))
+ `(cfw:face-grid ((,class :foreground ,fg-inactive)))
+ `(cfw:face-header ((,class :inherit bold ::foreground ,fg-main)))
+ `(cfw:face-holiday ((,class :inherit bold :background ,bg-alt :foreground ,magenta)))
+ `(cfw:face-periods ((,class :foreground ,cyan-alt-other)))
+ `(cfw:face-saturday ((,class :inherit bold :background ,bg-alt :foreground ,magenta-alt)))
+ `(cfw:face-select ((,class :inherit modus-theme-intense-blue)))
+ `(cfw:face-sunday ((,class :inherit bold :background ,bg-alt :foreground ,magenta-alt-other)))
+ `(cfw:face-title ((,class :inherit ,modus-theme-variable-pitch
+ :foreground ,fg-special-warm
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4))))
+ `(cfw:face-today ((,class :inherit bold :foreground ,blue)))
+ `(cfw:face-today-title ((,class :inherit modus-theme-special-mild :box t)))
+ `(cfw:face-toolbar ((,class :background ,bg-active :foreground ,bg-active)))
+ `(cfw:face-toolbar-button-off ((,class :background ,bg-alt :foreground ,cyan)))
+ `(cfw:face-toolbar-button-on ((,class :inherit bold :background ,bg-main :foreground ,blue-intense)))
+;;;;; centaur-tabs
+ `(centaur-tabs-active-bar-face ((,class :background ,fg-tab-active)))
+ `(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)))
+ `(centaur-tabs-modified-marker-selected ((,class :inherit centaur-tabs-selected)))
+ `(centaur-tabs-modified-marker-unselected ((,class :inherit centaur-tabs-unselected)))
+ `(centaur-tabs-default ((,class :background ,bg-main :foreground ,bg-main)))
+ `(centaur-tabs-selected ((,class :inherit bold :background ,bg-tab-active :foreground ,fg-main)))
+ `(centaur-tabs-selected-modified ((,class :background ,bg-tab-active :foreground ,fg-main :slant italic)))
+ `(centaur-tabs-unselected ((,class :background ,bg-tab-inactive :foreground ,fg-dim)))
+ `(centaur-tabs-unselected-modified ((,class :background ,bg-tab-inactive :foreground ,fg-dim :slant italic)))
+;;;;; change-log and log-view (`vc-print-log' and `vc-print-root-log')
+ `(change-log-acknowledgment ((,class :foreground ,fg-alt)))
+ `(change-log-conditionals ((,class :foreground ,magenta-alt)))
+ `(change-log-date ((,class :foreground ,cyan-alt-other)))
+ `(change-log-email ((,class :foreground ,cyan)))
+ `(change-log-file ((,class :foreground ,blue)))
+ `(change-log-function ((,class :foreground ,green-alt-other)))
+ `(change-log-list ((,class :foreground ,magenta-alt-other)))
+ `(change-log-name ((,class :foreground ,cyan)))
+ `(log-edit-header ((,class :inherit bold :foreground ,green-alt-other)))
+ `(log-edit-summary ((,class :foreground ,magenta-alt-other)))
+ `(log-edit-unknown-header ((,class :foreground ,fg-alt)))
+ `(log-view-file ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(log-view-message ((,class :foreground ,fg-alt)))
+;;;;; 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-docview-emphasis-face ((,class :foreground ,fg-special-cold :slant italic)))
+ `(cider-docview-literal-face ((,class :foreground ,blue-alt)))
+ `(cider-docview-strong-face ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(cider-docview-table-border-face ((,class :foreground ,fg-alt)))
+ `(cider-enlightened-face ((,class :box (:line-width -1 :color ,yellow-alt :style nil) :background ,bg-dim)))
+ `(cider-enlightened-local-face ((,class :inherit bold :foreground ,yellow-alt-other)))
+ `(cider-error-highlight-face ((,class :foreground ,red :underline t)))
+ `(cider-fragile-button-face ((,class :box (:line-width 3 :color ,fg-alt :style released-button) :foreground ,yellow)))
+ `(cider-fringe-good-face ((,class :foreground ,green-active)))
+ `(cider-instrumented-face ((,class :box (:line-width -1 :color ,red :style nil) :background ,bg-dim)))
+ `(cider-reader-conditional-face ((,class :foreground ,fg-special-warm :slant italic)))
+ `(cider-repl-input-face ((,class :inherit bold)))
+ `(cider-repl-prompt-face ((,class :foreground ,cyan-alt-other)))
+ `(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)))
+ `(cider-stacktrace-error-class-face ((,class :inherit bold :foreground ,red)))
+ `(cider-stacktrace-error-message-face ((,class :foreground ,red-alt-other :slant italic)))
+ `(cider-stacktrace-face ((,class :foreground ,fg-main)))
+ `(cider-stacktrace-filter-active-face ((,class :foreground ,cyan-alt :underline t)))
+ `(cider-stacktrace-filter-inactive-face ((,class :foreground ,cyan-alt)))
+ `(cider-stacktrace-fn-face ((,class :inherit bold :foreground ,fg-main)))
+ `(cider-stacktrace-ns-face ((,class :foreground ,fg-alt :slant italic)))
+ `(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-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 :foreground ,fg-alt)))
+ `(circe-highlight-nick-face ((,class :inherit bold :foreground ,blue)))
+ `(circe-prompt-face ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(circe-server-face ((,class :foreground ,fg-unfocused)))
+ `(lui-button-face ((,class :foreground ,blue :underline t)))
+ `(lui-highlight-face ((,class :foreground ,magenta-alt)))
+ `(lui-time-stamp-face ((,class :foreground ,blue-nuanced)))
+;;;;; color-rg
+ `(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-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)))
+ `(color-rg-font-lock-header-line-text ((,class :foreground ,fg-active)))
+ `(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-position-splitter ((,class :foreground ,fg-alt)))
+;;;;; column-enforce-mode
+ `(column-enforce-face ((,class :inherit modus-theme-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-scrollbar-bg ((,class :background ,bg-active)))
+ `(company-scrollbar-fg ((,class :background ,fg-active)))
+ `(company-template-field ((,class :inherit modus-theme-intense-magenta)))
+ `(company-tooltip ((,class :background ,bg-alt :foreground ,fg-alt)))
+ `(company-tooltip-annotation ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(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-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 ,@(modus-vivendi-theme-bold-weight) :foreground ,red)))
+ `(compilation-info ((,class :foreground ,fg-special-cold)))
+ `(compilation-line-number ((,class :foreground ,fg-special-warm)))
+ `(compilation-mode-line-exit ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,blue-active)))
+ `(compilation-mode-line-fail ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,red-active)))
+ `(compilation-mode-line-run ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,magenta-active)))
+ `(compilation-warning ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,yellow)))
+;;;;; completions
+ `(completions-annotations ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(completions-common-part ((,class ,@(modus-vivendi-theme-standard-completions
+ cyan-alt-other cyan-nuanced-bg
+ yellow-refine-bg yellow-refine-fg))))
+ `(completions-first-difference ((,class :inherit bold
+ ,@(modus-vivendi-theme-standard-completions
+ blue-alt-other blue-nuanced-bg
+ cyan-subtle-bg fg-dim))))
+;;;;; 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-outline-1 ((,class :inherit outline-1)))
+ `(counsel-outline-2 ((,class :inherit outline-2)))
+ `(counsel-outline-3 ((,class :inherit outline-3)))
+ `(counsel-outline-4 ((,class :inherit outline-4)))
+ `(counsel-outline-5 ((,class :inherit outline-5)))
+ `(counsel-outline-6 ((,class :inherit outline-6)))
+ `(counsel-outline-7 ((,class :inherit outline-7)))
+ `(counsel-outline-8 ((,class :inherit outline-8)))
+ `(counsel-outline-default ((,class :inherit bold :foreground ,green-alt-other)))
+ `(counsel-variable-documentation ((,class :foreground ,yellow-alt-other :slant ,modus-theme-slant)))
+;;;;; counsel-css
+ `(counsel-css-selector-depth-face-1 ((,class :foreground ,blue)))
+ `(counsel-css-selector-depth-face-2 ((,class :foreground ,cyan)))
+ `(counsel-css-selector-depth-face-3 ((,class :foreground ,green)))
+ `(counsel-css-selector-depth-face-4 ((,class :foreground ,yellow)))
+ `(counsel-css-selector-depth-face-5 ((,class :foreground ,magenta)))
+ `(counsel-css-selector-depth-face-6 ((,class :foreground ,red)))
+;;;;; counsel-notmuch
+ `(counsel-notmuch-count-face ((,class :foreground ,cyan)))
+ `(counsel-notmuch-date-face ((,class :foreground ,blue)))
+ `(counsel-notmuch-people-face ((,class :foreground ,magenta)))
+ `(counsel-notmuch-subject-face ((,class :foreground ,magenta-alt-other)))
+;;;;; counsel-org-capture-string
+ `(counsel-org-capture-string-template-body-face ((,class :foreground ,fg-special-cold)))
+;;;;; cov
+ `(cov-coverage-not-run-face ((,class :foreground ,red-intense)))
+ `(cov-coverage-run-face ((,class :foreground ,green-intense)))
+ `(cov-heavy-face ((,class :foreground ,magenta-intense)))
+ `(cov-light-face ((,class :foreground ,blue-intense)))
+ `(cov-med-face ((,class :foreground ,yellow-intense)))
+ `(cov-none-face ((,class :foreground ,cyan-intense)))
+;;;;; 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)))
+;;;;; custom (M-x customize)
+ `(custom-button ((,class :box (:line-width 2 :color nil :style released-button)
+ :background ,bg-active :foreground ,fg-main)))
+ `(custom-button-mouse ((,class :box (:line-width 2 :color nil :style released-button)
+ :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-comment ((,class :foreground ,fg-alt)))
+ `(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-set ((,class :foreground ,blue-alt)))
+ `(custom-state ((,class :foreground ,cyan-alt-other)))
+ `(custom-themed ((,class :inherit modus-theme-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)
+ :background ,bg-active :foreground ,fg-main)))
+ `(dap-result-overlay-face ((,class :box (:line-width -1 :color ,bg-active :style nil)
+ :background ,bg-active :foreground ,fg-main)))
+ `(dap-ui-breakpoint-verified-fringe ((,class :inherit bold :foreground ,green-active)))
+ `(dap-ui-compile-errline ((,class :inherit bold :foreground ,red-intense)))
+ `(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 :foreground ,cyan-alt-other :slant italic)))
+ `(dap-ui-marker-face ((,class :inherit modus-theme-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 :foreground ,fg-alt)))
+;;;;; dashboard (emacs-dashboard)
+ `(dashboard-banner-logo-title ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(dashboard-footer ((,class :inherit bold :foreground ,fg-special-mild)))
+ `(dashboard-heading ((,class :inherit bold :foreground ,fg-special-warm)))
+ `(dashboard-navigator ((,class :foreground ,cyan-alt-other)))
+ `(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-meta-face ((,class :foreground ,fg-alt)))
+ `(deadgrep-regexp-metachar-face ((,class :inherit bold :foreground ,yellow-intense)))
+ `(deadgrep-search-term-face ((,class :inherit bold :foreground ,green-intense)))
+;;;;; debbugs
+ `(debbugs-gnu-archived ((,class :inverse-video t)))
+ `(debbugs-gnu-done ((,class :foreground ,fg-alt)))
+ `(debbugs-gnu-forwarded ((,class :foreground ,fg-special-warm)))
+ `(debbugs-gnu-handled ((,class :foreground ,green)))
+ `(debbugs-gnu-new ((,class :foreground ,red)))
+ `(debbugs-gnu-pending ((,class :foreground ,cyan)))
+ `(debbugs-gnu-stale-1 ((,class :foreground ,yellow-nuanced)))
+ `(debbugs-gnu-stale-2 ((,class :foreground ,yellow)))
+ `(debbugs-gnu-stale-3 ((,class :foreground ,yellow-alt)))
+ `(debbugs-gnu-stale-4 ((,class :foreground ,yellow-alt-other)))
+ `(debbugs-gnu-stale-5 ((,class :foreground ,red-alt)))
+ `(debbugs-gnu-tagged ((,class :foreground ,magenta-alt)))
+;;;;; define-word
+ `(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-face ((,class :foreground ,green-intense)))
+ `(deft-header-face ((,class :inherit bold :foreground ,fg-special-warm)))
+ `(deft-separator-face ((,class :foreground ,fg-alt)))
+ `(deft-summary-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(deft-time-face ((,class :foreground ,fg-special-cold)))
+ `(deft-title-face ((,class :inherit bold :foreground ,fg-main)))
+;;;;; dictionary
+ `(dictionary-button-face ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(dictionary-reference-face ((,class :foreground ,blue-alt-other :underline t)))
+ `(dictionary-word-definition-face ((,class :foreground ,fg-main)))
+ `(dictionary-word-entry-face ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+;;;;; diff-hl
+ `(diff-hl-change ((,class :inherit modus-theme-fringe-yellow)))
+ `(diff-hl-delete ((,class :inherit modus-theme-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-mode
+ `(diff-added ((,class ,@(modus-vivendi-theme-diffs
+ bg-main green
+ bg-diff-focus-added fg-diff-focus-added))))
+ `(diff-changed ((,class ,@(modus-vivendi-theme-diffs
+ bg-main yellow
+ bg-diff-focus-changed fg-diff-focus-changed))))
+ `(diff-context ((,class :foreground ,fg-unfocused)))
+ `(diff-file-header ((,class :inherit bold :foreground ,blue)))
+ `(diff-function ((,class :foreground ,fg-special-cold)))
+ `(diff-header ((,class :foreground ,blue-nuanced)))
+ `(diff-hunk-header ((,class ,@(modus-vivendi-theme-diffs
+ bg-alt blue-alt
+ bg-diff-heading fg-diff-heading))))
+ `(diff-index ((,class :inherit bold :foreground ,blue-alt)))
+ `(diff-indicator-added ((,class :inherit diff-added)))
+ `(diff-indicator-changed ((,class :inherit diff-changed)))
+ `(diff-indicator-removed ((,class :inherit diff-removed)))
+ `(diff-nonexistent ((,class :inherit (modus-theme-neutral bold))))
+ `(diff-refine-added ((,class ,@(modus-vivendi-theme-diffs
+ bg-diff-added fg-diff-added
+ bg-diff-refine-added fg-diff-refine-added))))
+ `(diff-refine-changed ((,class ,@(modus-vivendi-theme-diffs
+ bg-diff-changed fg-diff-changed
+ bg-diff-refine-changed fg-diff-refine-changed))))
+ `(diff-refine-removed ((,class ,@(modus-vivendi-theme-diffs
+ bg-diff-removed fg-diff-removed
+ bg-diff-refine-removed fg-diff-refine-removed))))
+ `(diff-removed ((,class ,@(modus-vivendi-theme-diffs
+ bg-main red
+ bg-diff-focus-removed fg-diff-focus-removed))))
+;;;;; dim-autoload
+ `(dim-autoload-cookie-line ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+;;;;; dired
+ `(dired-directory ((,class :foreground ,blue)))
+ `(dired-flagged ((,class :inherit modus-theme-mark-del)))
+ `(dired-header ((,class :inherit modus-theme-header)))
+ `(dired-ignored ((,class :foreground ,fg-alt)))
+ `(dired-mark ((,class :inherit modus-theme-mark-symbol)))
+ `(dired-marked ((,class :inherit modus-theme-mark-sel)))
+ `(dired-perm-write ((,class :foreground ,fg-special-warm)))
+ `(dired-symlink ((,class :foreground ,cyan-alt :underline t)))
+ `(dired-warning ((,class :inherit bold :foreground ,yellow)))
+;;;;; dired-async
+ `(dired-async-failures ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,red-active)))
+ `(dired-async-message ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,green-active)))
+ `(dired-async-mode-message ((,class ,@(modus-vivendi-theme-bold-weight) :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-subtree
+ ;; remove background from dired-subtree, else it breaks
+ ;; dired-{flagged,marked} and any other face that sets a background
+ ;; such as hl-line
+ `(dired-subtree-depth-1-face ((,class :background nil)))
+ `(dired-subtree-depth-2-face ((,class :background nil)))
+ `(dired-subtree-depth-3-face ((,class :background nil)))
+ `(dired-subtree-depth-4-face ((,class :background nil)))
+ `(dired-subtree-depth-5-face ((,class :background nil)))
+ `(dired-subtree-depth-6-face ((,class :background nil)))
+;;;;; diredfl
+ `(diredfl-autofile-name ((,class :inherit modus-theme-special-cold)))
+ `(diredfl-compressed-file-name ((,class :foreground ,green-alt-other)))
+ `(diredfl-compressed-file-suffix ((,class :foreground ,green-alt)))
+ `(diredfl-date-time ((,class :foreground ,fg-special-cold)))
+ `(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-header)))
+ `(diredfl-dir-name ((,class :inherit dired-directory)))
+ `(diredfl-dir-priv ((,class :foreground ,blue)))
+ `(diredfl-exec-priv ((,class :foreground ,red-alt-other)))
+ `(diredfl-executable-tag ((,class :foreground ,red-alt)))
+ `(diredfl-file-name ((,class :foreground ,fg-main)))
+ `(diredfl-file-suffix ((,class :foreground ,fg-special-warm)))
+ `(diredfl-flag-mark ((,class :inherit modus-theme-mark-sel)))
+ `(diredfl-flag-mark-line ((,class :inherit modus-theme-mark-sel)))
+ `(diredfl-ignored-file-name ((,class :foreground ,fg-inactive)))
+ `(diredfl-link-priv ((,class :foreground ,blue-alt-other)))
+ `(diredfl-no-priv ((,class :foreground ,fg-inactive)))
+ `(diredfl-number ((,class :foreground ,cyan)))
+ `(diredfl-other-priv ((,class :foreground ,yellow)))
+ `(diredfl-rare-priv ((,class :foreground ,magenta-alt-other)))
+ `(diredfl-read-priv ((,class :foreground ,magenta)))
+ `(diredfl-symlink ((,class :foreground ,cyan-alt :underline t)))
+ `(diredfl-tagged-autofile-name ((,class :inherit modus-theme-refine-magenta)))
+ `(diredfl-write-priv ((,class :foreground ,cyan-alt-other)))
+;;;;; disk-usage
+ `(disk-usage-children ((,class :foreground ,yellow)))
+ `(disk-usage-inaccessible ((,class :inherit bold :foreground ,red)))
+ `(disk-usage-percent ((,class :foreground ,green)))
+ `(disk-usage-size ((,class :foreground ,cyan)))
+ `(disk-usage-symlink ((,class :foreground ,blue :underline t)))
+ `(disk-usage-symlink-directory ((,class :inherit bold :foreground ,blue-alt)))
+;;;;; doom-modeline
+ `(doom-modeline-bar ((,class :inherit modus-theme-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)))
+ `(doom-modeline-battery-error ((,class :inherit modus-theme-active-red)))
+ `(doom-modeline-battery-full ((,class :foreground ,blue-active)))
+ `(doom-modeline-battery-normal ((,class :foreground ,fg-active)))
+ `(doom-modeline-battery-warning ((,class :inherit bold :foreground ,yellow-active)))
+ `(doom-modeline-buffer-file ((,class :inherit bold :foreground ,fg-active)))
+ `(doom-modeline-buffer-major-mode ((,class :inherit bold :foreground ,cyan-active)))
+ `(doom-modeline-buffer-minor-mode ((,class :foreground ,fg-inactive)))
+ `(doom-modeline-buffer-modified ((,class :inherit bold :foreground ,magenta-active)))
+ `(doom-modeline-buffer-path ((,class :inherit bold :foreground ,fg-active)))
+ `(doom-modeline-debug ((,class :inherit bold :foreground ,yellow-active)))
+ `(doom-modeline-debug-visual ((,class :inherit bold :foreground ,red-active)))
+ `(doom-modeline-evil-emacs-state ((,class :inherit bold :foreground ,magenta-active)))
+ `(doom-modeline-evil-insert-state ((,class :inherit bold :foreground ,green-active)))
+ `(doom-modeline-evil-motion-state ((,class :inherit bold :foreground ,fg-inactive)))
+ `(doom-modeline-evil-normal-state ((,class :inherit bold :foreground ,fg-active)))
+ `(doom-modeline-evil-operator-state ((,class :inherit bold :foreground ,blue-active)))
+ `(doom-modeline-evil-replace-state ((,class :inherit bold :foreground ,red-active)))
+ `(doom-modeline-evil-visual-state ((,class :inherit bold :foreground ,cyan-active)))
+ `(doom-modeline-highlight ((,class :inherit bold :foreground ,blue-active)))
+ `(doom-modeline-host ((,class :slant italic)))
+ `(doom-modeline-info ((,class :foreground ,green-active)))
+ `(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-persp-buffer-not-in-persp ((,class :foreground ,yellow-active :slant italic)))
+ `(doom-modeline-persp-name ((,class :foreground ,fg-active)))
+ `(doom-modeline-project-dir ((,class :inherit bold :foreground ,blue-active)))
+ `(doom-modeline-project-parent-dir ((,class :foreground ,blue-active)))
+ `(doom-modeline-project-root-dir ((,class :foreground ,fg-active)))
+ `(doom-modeline-unread-number ((,class :foreground ,fg-active :slant italic)))
+ `(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)))
+;;;;; 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)))
+;;;;; ebdb
+ `(ebdb-address-default ((,class :foreground ,fg-main)))
+ `(ebdb-db-char ((,class :foreground ,fg-special-cold)))
+ `(ebdb-defunct ((,class :foreground ,fg-alt)))
+ `(ebdb-field-hidden ((,class :foreground ,magenta)))
+ `(ebdb-field-url ((,class :foreground ,blue)))
+ `(ebdb-label ((,class :foreground ,cyan-alt-other)))
+ `(ebdb-mail-default ((,class :foreground ,fg-main)))
+ `(ebdb-mail-primary ((,class :foreground ,blue-alt)))
+ `(ebdb-marked ((,class :background ,cyan-intense-bg)))
+ `(ebdb-organization-name ((,class :foreground ,fg-special-calm)))
+ `(ebdb-person-name ((,class :foreground ,magenta-alt-other)))
+ `(ebdb-phone-default ((,class :foreground ,fg-special-warm)))
+ `(ebdb-role-defunct ((,class :foreground ,fg-alt)))
+ `(eieio-custom-slot-tag-face ((,class :foreground ,red-alt)))
+;;;;; ediff
+ `(ediff-current-diff-A ((,class ,@(modus-vivendi-theme-diffs
+ bg-alt red
+ bg-diff-removed fg-diff-removed))))
+ `(ediff-current-diff-Ancestor ((,class ,@(modus-vivendi-theme-diffs
+ bg-alt fg-special-cold
+ bg-special-cold fg-special-cold))))
+ `(ediff-current-diff-B ((,class ,@(modus-vivendi-theme-diffs
+ bg-alt green
+ bg-diff-added fg-diff-added))))
+ `(ediff-current-diff-C ((,class ,@(modus-vivendi-theme-diffs
+ bg-alt yellow
+ bg-diff-changed fg-diff-changed))))
+ `(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 ,bg-diff-focus-added :foreground ,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)))
+;;;;; eglot
+ `(eglot-mode-line ((,class ,@(modus-vivendi-theme-bold-weight) :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)))
+;;;;; eldoc-box
+ `(eldoc-box-body ((,class :background ,bg-alt :foreground ,fg-main)))
+ `(eldoc-box-border ((,class :background ,fg-alt)))
+;;;;; elfeed
+ `(elfeed-log-date-face ((,class :foreground ,cyan-alt)))
+ `(elfeed-log-debug-level-face ((,class :foreground ,magenta)))
+ `(elfeed-log-error-level-face ((,class :foreground ,red)))
+ `(elfeed-log-info-level-face ((,class :foreground ,green)))
+ `(elfeed-log-warn-level-face ((,class :foreground ,yellow)))
+ `(elfeed-search-date-face ((,class :foreground ,cyan)))
+ `(elfeed-search-feed-face ((,class :foreground ,blue)))
+ `(elfeed-search-filter-face ((,class :foreground ,magenta-active)))
+ `(elfeed-search-last-update-face ((,class :foreground ,green-active)))
+ `(elfeed-search-tag-face ((,class :foreground ,cyan-alt-other)))
+ `(elfeed-search-title-face ((,class :foreground ,fg-main)))
+ `(elfeed-search-unread-count-face ((,class :foreground ,blue-active)))
+ `(elfeed-search-unread-title-face ((,class :inherit bold)))
+;;;;; elfeed-score
+ `(elfeed-score-date-face ((,class :foreground ,blue)))
+ `(elfeed-score-debug-level-face ((,class :foreground ,magenta-alt-other)))
+ `(elfeed-score-error-level-face ((,class :foreground ,red)))
+ `(elfeed-score-info-level-face ((,class :foreground ,cyan)))
+ `(elfeed-score-warn-level-face ((,class :foreground ,yellow)))
+;;;;; 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-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)))
+;;;;; epa
+ `(epa-field-body ((,class :foreground ,fg-main)))
+ `(epa-field-name ((,class :inherit bold :foreground ,fg-dim)))
+ `(epa-mark ((,class :inherit bold :foreground ,magenta)))
+ `(epa-string ((,class :foreground ,blue-alt)))
+ `(epa-validity-disabled ((,class :inherit modus-theme-refine-red)))
+ `(epa-validity-high ((,class :inherit bold :foreground ,green-alt-other)))
+ `(epa-validity-low ((,class :foreground ,fg-alt)))
+ `(epa-validity-medium ((,class :foreground ,green-alt)))
+;;;;; equake
+ `(equake-buffer-face ((,class :background ,bg-main :foreground ,fg-main)))
+ `(equake-shell-type-eshell ((,class :background ,bg-inactive :foreground ,green-active)))
+ `(equake-shell-type-rash ((,class :background ,bg-inactive :foreground ,red-active)))
+ `(equake-shell-type-shell ((,class :background ,bg-inactive :foreground ,cyan-active)))
+ `(equake-shell-type-term ((,class :background ,bg-inactive :foreground ,yellow-active)))
+ `(equake-shell-type-vterm ((,class :background ,bg-inactive :foreground ,magenta-active)))
+ `(equake-tab-active ((,class :background ,fg-alt :foreground ,bg-alt)))
+ `(equake-tab-inactive ((,class :foreground ,fg-inactive)))
+;;;;; erc
+ `(erc-action-face ((,class :inherit bold :foreground ,cyan)))
+ `(erc-bold-face ((,class :inherit bold)))
+ `(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-direct-msg-face ((,class :foreground ,magenta)))
+ `(erc-error-face ((,class :inherit bold :foreground ,red)))
+ `(erc-fool-face ((,class :foreground ,fg-inactive)))
+ `(erc-header-line ((,class :background ,bg-header :foreground ,fg-header)))
+ `(erc-input-face ((,class :foreground ,fg-special-calm)))
+ `(erc-inverse-face ((,class :inherit erc-default-face :inverse-video t)))
+ `(erc-keyword-face ((,class :inherit bold :foreground ,magenta-alt)))
+ `(erc-my-nick-face ((,class :inherit bold :foreground ,magenta)))
+ `(erc-my-nick-prefix-face ((,class :inherit erc-my-nick-face)))
+ `(erc-nick-default-face ((,class :inherit bold :foreground ,blue)))
+ `(erc-nick-msg-face ((,class :inherit bold :foreground ,green)))
+ `(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-timestamp-face ((,class :foreground ,blue-nuanced)))
+ `(erc-underline-face ((,class :underline t)))
+;;;;; eros
+ `(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)))
+;;;;; 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-product ((,class :foreground ,fg-special-warm)))
+ `(eshell-ls-readonly ((,class :foreground ,fg-special-cold)))
+ `(eshell-ls-special ((,class :inherit bold :foreground ,magenta)))
+ `(eshell-ls-symlink ((,class :foreground ,cyan :underline t)))
+ `(eshell-ls-unreadable ((,class :background ,bg-inactive :foreground ,fg-inactive)))
+ `(eshell-prompt ((,class ,@(modus-vivendi-theme-bold-weight)
+ ,@(modus-vivendi-theme-prompt green-alt-other
+ green-nuanced-bg
+ green-alt
+ green-refine-bg
+ fg-main))))
+;;;;; eshell-fringe-status
+ `(eshell-fringe-status-failure ((,class :foreground ,red)))
+ `(eshell-fringe-status-success ((,class :foreground ,green)))
+;;;;; eshell-git-prompt
+ `(eshell-git-prompt-add-face ((,class :foreground ,fg-alt)))
+ `(eshell-git-prompt-branch-face ((,class :foreground ,fg-alt)))
+ `(eshell-git-prompt-directory-face ((,class :foreground ,cyan)))
+ `(eshell-git-prompt-exit-fail-face ((,class :foreground ,red)))
+ `(eshell-git-prompt-exit-success-face ((,class :foreground ,green)))
+ `(eshell-git-prompt-modified-face ((,class :foreground ,yellow)))
+ `(eshell-git-prompt-powerline-clean-face ((,class :background ,green-refine-bg)))
+ `(eshell-git-prompt-powerline-dir-face ((,class :background ,blue-refine-bg)))
+ `(eshell-git-prompt-powerline-not-clean-face ((,class :background ,magenta-refine-bg)))
+ `(eshell-git-prompt-robyrussell-branch-face ((,class :foreground ,red)))
+ `(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 ,@(modus-vivendi-theme-bold-weight) :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 :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(epe-status-face ((,class :foreground ,magenta-alt-other)))
+ `(epe-venv-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+;;;;; 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-goggles
+ `(evil-goggles-change-face ((,class :inherit modus-theme-refine-yellow)))
+ `(evil-goggles-commentary-face ((,class :inherit modus-theme-subtle-neutral :slant ,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-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-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-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-visual-mark-mode
+ `(evil-visual-mark-face ((,class :inherit modus-theme-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)))
+;;;;; 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 :foreground ,fg-alt :underline t)))
+ `(fancy-dabbrev-selection-face ((,class :inherit (modus-theme-intense-cyan bold))))
+;;;;; flycheck
+ `(flycheck-error
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-error :style wave))
+ (,class :foreground ,fg-lang-error :underline t)))
+ `(flycheck-error-list-checker-name ((,class :foreground ,magenta-active)))
+ `(flycheck-error-list-column-number ((,class :foreground ,fg-special-cold)))
+ `(flycheck-error-list-error ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,red)))
+ `(flycheck-error-list-filename ((,class :foreground ,blue)))
+ `(flycheck-error-list-highlight ((,class :inherit modus-theme-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
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-note :style wave))
+ (,class :foreground ,fg-lang-note :underline t)))
+ `(flycheck-verify-select-checker ((,class :box (:line-width 1 :color nil :style released-button))))
+ `(flycheck-warning
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-warning :style wave))
+ (,class :foreground ,fg-lang-warning :underline t)))
+;;;;; flycheck-indicator
+ `(flycheck-indicator-disabled ((,class :foreground ,fg-inactive :slant ,modus-theme-slant)))
+ `(flycheck-indicator-error ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,red-active)))
+ `(flycheck-indicator-info ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,blue-active)))
+ `(flycheck-indicator-running ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,magenta-active)))
+ `(flycheck-indicator-success ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,green-active)))
+ `(flycheck-indicator-warning ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,yellow-active)))
+;;;;; flycheck-posframe
+ `(flycheck-posframe-background-face ((,class :background ,bg-alt)))
+ `(flycheck-posframe-border-face ((,class :foreground ,fg-alt)))
+ `(flycheck-posframe-error-face ((,class :inherit bold :foreground ,red)))
+ `(flycheck-posframe-face ((,class :foreground ,fg-main :slant ,modus-theme-slant)))
+ `(flycheck-posframe-info-face ((,class :inherit bold :foreground ,cyan)))
+ `(flycheck-posframe-warning-face ((,class :inherit bold :foreground ,yellow)))
+;;;;; flymake
+ `(flymake-error
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-error :style wave))
+ (,class :foreground ,fg-lang-error :underline t)))
+ `(flymake-note
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-note :style wave))
+ (,class :foreground ,fg-lang-note :underline t)))
+ `(flymake-warning
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-warning :style wave))
+ (,class :foreground ,fg-lang-warning :underline t)))
+;;;;; flyspell
+ `(flyspell-duplicate
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-warning :style wave))
+ (,class :foreground ,fg-lang-warning :underline t)))
+ `(flyspell-incorrect
+ ((,(append '((supports :underline (:style wave))) class)
+ :underline (:color ,fg-lang-error :style wave))
+ (,class :foreground ,fg-lang-error :underline t)))
+;;;;; flyspell-correct
+ `(flyspell-correct-highlight-face ((,class :inherit modus-theme-refine-green)))
+;;;;; flx
+ `(flx-highlight-face ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-intense-magenta
+ 'modus-theme-nuanced-magenta
+ magenta-alt-other
+ '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-actions-face ((,class :foreground ,magenta)))
+ `(frog-menu-border ((,class :background ,bg-active)))
+ `(frog-menu-candidates-face ((,class :foreground ,fg-main)))
+ `(frog-menu-posframe-background-face ((,class :background ,bg-dim)))
+ `(frog-menu-prompt-face ((,class :foreground ,cyan)))
+;;;;; focus
+ `(focus-unfocused ((,class :foreground ,fg-unfocused)))
+;;;;; fold-this
+ `(fold-this-overlay ((,class :inherit modus-theme-special-mild)))
+;;;;; font-lock
+ `(font-lock-builtin-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(font-lock-comment-delimiter-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(font-lock-comment-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(font-lock-constant-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(font-lock-doc-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ fg-special-cold cyan-alt-other-faint)
+ :slant ,modus-theme-slant)))
+ `(font-lock-function-name-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(font-lock-keyword-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(font-lock-negation-char-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ yellow yellow-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(font-lock-preprocessor-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ red-alt-other red-alt-other-faint))))
+ `(font-lock-regexp-grouping-backslash ((,class :inherit bold :foreground ,fg-escape-char-backslash)))
+ `(font-lock-regexp-grouping-construct ((,class :inherit bold :foreground ,fg-escape-char-construct)))
+ `(font-lock-string-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue-alt blue-alt-faint))))
+ `(font-lock-type-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint))))
+ `(font-lock-variable-name-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(font-lock-warning-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ yellow-active yellow-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+;;;;; forge
+ `(forge-post-author ((,class :inherit bold :foreground ,fg-main)))
+ `(forge-post-date ((,class :foreground ,fg-special-cold)))
+ `(forge-topic-closed ((,class :foreground ,fg-alt)))
+ `(forge-topic-merged ((,class :foreground ,fg-alt)))
+ `(forge-topic-open ((,class :foreground ,fg-special-mild)))
+ `(forge-topic-unmerged ((,class :foreground ,magenta :slant ,modus-theme-slant)))
+ `(forge-topic-unread ((,class :inherit bold :foreground ,fg-main)))
+;;;;; fountain-mode
+ `(fountain-character ((,class :foreground ,blue-alt-other)))
+ `(fountain-comment ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(fountain-dialog ((,class :foreground ,blue-alt)))
+ `(fountain-metadata-key ((,class :foreground ,green-alt-other)))
+ `(fountain-metadata-value ((,class :foreground ,blue)))
+ `(fountain-non-printing ((,class :foreground ,fg-alt)))
+ `(fountain-note ((,class :foreground ,yellow :slant ,modus-theme-slant)))
+ `(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)))
+ `(fountain-section-heading ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-main
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4))))
+ `(fountain-section-heading-1 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-main
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4))))
+ `(fountain-section-heading-2 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-warm
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-3))))
+ `(fountain-section-heading-3 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-mild
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-2))))
+ `(fountain-section-heading-4 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-calm
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-1))))
+ `(fountain-section-heading-5 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-calm)))
+ `(fountain-synopsis ((,class :foreground ,cyan-alt)))
+ `(fountain-trans ((,class :foreground ,yellow-alt-other)))
+;;;;; geiser
+ `(geiser-font-lock-autodoc-current-arg ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(geiser-font-lock-autodoc-identifier ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue blue-faint))))
+ `(geiser-font-lock-doc-button ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan-alt cyan-alt-faint)
+ :underline t)))
+ `(geiser-font-lock-doc-link ((,class :inherit link)))
+ `(geiser-font-lock-error-link ((,class ,@(modus-vivendi-theme-syntax-foreground
+ red-alt red-alt-faint)
+ :underline t)))
+ `(geiser-font-lock-image-button ((,class ,@(modus-vivendi-theme-syntax-foreground
+ green-alt green-alt-faint)
+ :underline t)))
+ `(geiser-font-lock-repl-input ((,class :inherit bold)))
+ `(geiser-font-lock-repl-output ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint))))
+ `(geiser-font-lock-repl-prompt ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint))))
+ `(geiser-font-lock-xref-header ((,class :inherit bold)))
+ `(geiser-font-lock-xref-link ((,class :inherit link)))
+;;;;; git-commit
+ `(git-commit-comment-action ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(git-commit-comment-branch-local ((,class :foreground ,blue-alt :slant ,modus-theme-slant)))
+ `(git-commit-comment-branch-remote ((,class :foreground ,magenta-alt :slant ,modus-theme-slant)))
+ `(git-commit-comment-detached ((,class :foreground ,cyan-alt :slant ,modus-theme-slant)))
+ `(git-commit-comment-file ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(git-commit-comment-heading ((,class :inherit bold :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(git-commit-keyword ((,class :foreground ,magenta)))
+ `(git-commit-known-pseudo-header ((,class :inherit bold :foreground ,fg-special-warm)))
+ `(git-commit-nonempty-second-line ((,class :inherit modus-theme-refine-yellow)))
+ `(git-commit-overlong-summary ((,class :inherit modus-theme-refine-yellow)))
+ `(git-commit-pseudo-header ((,class :inherit bold :foreground ,fg-alt)))
+ `(git-commit-summary ((,class :foreground ,magenta-alt-other)))
+;;;;; 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-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,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-lens
+ `(git-lens-added ((,class :inherit bold :foreground ,green)))
+ `(git-lens-deleted ((,class :inherit bold :foreground ,red)))
+ `(git-lens-header ((,class :inherit bold :height 1.1 :foreground ,cyan)))
+ `(git-lens-modified ((,class :inherit bold :foreground ,yellow)))
+ `(git-lens-renamed ((,class :inherit bold :foreground ,magenta)))
+;;;;; git-rebase
+ `(git-rebase-comment-hash ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(git-rebase-comment-heading ((,class :inherit bold :foreground ,fg-dim :slant ,modus-theme-slant)))
+ `(git-rebase-description ((,class :foreground ,fg-main)))
+ `(git-rebase-hash ((,class :foreground ,cyan-alt-other)))
+;;;;; git-timemachine
+ `(git-timemachine-commit ((,class :inherit bold :foreground ,yellow-active)))
+ `(git-timemachine-minibuffer-author-face ((,class :foreground ,fg-special-warm)))
+ `(git-timemachine-minibuffer-detail-face ((,class :foreground ,red-alt)))
+;;;;; git-walktree
+ `(git-walktree-commit-face ((,class :foreground ,yellow)))
+ `(git-walktree-symlink-face ((,class :foreground ,cyan :underline t)))
+ `(git-walktree-tree-face ((,class :foreground ,magenta)))
+;;;;; gnus
+ `(gnus-button ((,class :inherit button)))
+ `(gnus-cite-1 ((,class :foreground ,blue-alt)))
+ `(gnus-cite-10 ((,class :foreground ,magenta-alt-other)))
+ `(gnus-cite-11 ((,class :foreground ,yellow-alt-other)))
+ `(gnus-cite-2 ((,class :foreground ,red-alt)))
+ `(gnus-cite-3 ((,class :foreground ,green-alt)))
+ `(gnus-cite-4 ((,class :foreground ,magenta-alt)))
+ `(gnus-cite-5 ((,class :foreground ,yellow-alt)))
+ `(gnus-cite-6 ((,class :foreground ,cyan-alt)))
+ `(gnus-cite-7 ((,class :foreground ,blue-alt-other)))
+ `(gnus-cite-8 ((,class :foreground ,red-alt-other)))
+ `(gnus-cite-9 ((,class :foreground ,green-alt-other)))
+ `(gnus-cite-attribution ((,class :foreground ,fg-main :slant italic)))
+ `(gnus-emphasis-highlight-words ((,class :inherit modus-theme-refine-yellow)))
+ `(gnus-group-mail-1 ((,class :inherit bold :foreground ,magenta-alt)))
+ `(gnus-group-mail-1-empty ((,class :foreground ,magenta-alt)))
+ `(gnus-group-mail-2 ((,class :inherit bold :foreground ,magenta)))
+ `(gnus-group-mail-2-empty ((,class :foreground ,magenta)))
+ `(gnus-group-mail-3 ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(gnus-group-mail-3-empty ((,class :foreground ,magenta-alt-other)))
+ `(gnus-group-mail-low ((,class :inherit bold :foreground ,magenta-nuanced)))
+ `(gnus-group-mail-low-empty ((,class :foreground ,magenta-nuanced)))
+ `(gnus-group-news-1 ((,class :inherit bold :foreground ,green)))
+ `(gnus-group-news-1-empty ((,class :foreground ,green)))
+ `(gnus-group-news-2 ((,class :inherit bold :foreground ,cyan)))
+ `(gnus-group-news-2-empty ((,class :foreground ,cyan)))
+ `(gnus-group-news-3 ((,class :inherit bold :foreground ,yellow-nuanced)))
+ `(gnus-group-news-3-empty ((,class :foreground ,yellow-nuanced)))
+ `(gnus-group-news-4 ((,class :inherit bold :foreground ,cyan-nuanced)))
+ `(gnus-group-news-4-empty ((,class :foreground ,cyan-nuanced)))
+ `(gnus-group-news-5 ((,class :inherit bold :foreground ,red-nuanced)))
+ `(gnus-group-news-5-empty ((,class :foreground ,red-nuanced)))
+ `(gnus-group-news-6 ((,class :inherit bold :foreground ,fg-alt)))
+ `(gnus-group-news-6-empty ((,class :foreground ,fg-alt)))
+ `(gnus-group-news-low ((,class :inherit bold :foreground ,green-nuanced)))
+ `(gnus-group-news-low-empty ((,class :foreground ,green-nuanced)))
+ `(gnus-header-content ((,class :foreground ,fg-special-calm)))
+ `(gnus-header-from ((,class :inherit bold :foreground ,cyan-alt :underline nil)))
+ `(gnus-header-name ((,class :foreground ,cyan-alt-other)))
+ `(gnus-header-newsgroups ((,class :inherit bold :foreground ,blue-alt)))
+ `(gnus-header-subject ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(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-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 :foreground ,fg-special-cold :slant italic)))
+ `(gnus-splash ((,class :foreground ,fg-alt)))
+ `(gnus-summary-cancelled ((,class :inherit modus-theme-mark-alt)))
+ `(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)))
+ `(gnus-summary-high-undownloaded ((,class :inherit bold :foreground ,yellow)))
+ `(gnus-summary-high-unread ((,class :inherit bold :foreground ,fg-main)))
+ `(gnus-summary-low-ancient ((,class :foreground ,fg-alt :slant italic)))
+ `(gnus-summary-low-read ((,class :foreground ,fg-special-cold :slant italic)))
+ `(gnus-summary-low-ticked ((,class :foreground ,red-refine-fg :slant italic)))
+ `(gnus-summary-low-undownloaded ((,class :foreground ,yellow-refine-fg :slant italic)))
+ `(gnus-summary-low-unread ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(gnus-summary-normal-ancient ((,class :foreground ,fg-special-calm)))
+ `(gnus-summary-normal-read ((,class :foreground ,fg-special-cold)))
+ `(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)))
+;;;;; 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-action ((,class :underline t)))
+ `(helm-bookmark-addressbook ((,class :foreground ,green-alt)))
+ `(helm-bookmark-directory ((,class :inherit bold :foreground ,blue)))
+ `(helm-bookmark-file ((,class :foreground ,fg-main)))
+ `(helm-bookmark-file-not-found ((,class :background ,bg-alt :foreground ,fg-alt)))
+ `(helm-bookmark-gnus ((,class :foreground ,magenta)))
+ `(helm-bookmark-info ((,class :foreground ,cyan-alt)))
+ `(helm-bookmark-man ((,class :foreground ,yellow-alt)))
+ `(helm-bookmark-w3m ((,class :foreground ,blue-alt)))
+ `(helm-buffer-archive ((,class :inherit bold :foreground ,cyan)))
+ `(helm-buffer-directory ((,class :inherit bold :foreground ,blue)))
+ `(helm-buffer-file ((,class :foreground ,fg-main)))
+ `(helm-buffer-modified ((,class :foreground ,yellow-alt)))
+ `(helm-buffer-not-saved ((,class :foreground ,red-alt)))
+ `(helm-buffer-process ((,class :foreground ,magenta)))
+ `(helm-buffer-saved-out ((,class :inherit bold :background ,bg-alt :foreground ,red)))
+ `(helm-buffer-size ((,class :foreground ,fg-alt)))
+ `(helm-candidate-number ((,class :foreground ,cyan-active)))
+ `(helm-candidate-number-suspended ((,class :foreground ,yellow-active)))
+ `(helm-comint-prompts-buffer-name ((,class :foreground ,green-active)))
+ `(helm-comint-prompts-promptidx ((,class :foreground ,cyan-active)))
+ `(helm-delete-async-message ((,class :inherit bold :foreground ,magenta-active)))
+ `(helm-eob-line ((,class :background ,bg-main :foreground ,fg-main)))
+ `(helm-eshell-prompts-buffer-name ((,class :foreground ,green-active)))
+ `(helm-eshell-prompts-promptidx ((,class :foreground ,cyan-active)))
+ `(helm-etags-file ((,class :foreground ,fg-dim :underline t)))
+ `(helm-ff-backup-file ((,class :foreground ,fg-alt)))
+ `(helm-ff-denied ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-red
+ 'modus-theme-intense-red
+ 'modus-theme-nuanced-red
+ red))))
+ `(helm-ff-directory ((,class :inherit helm-buffer-directory)))
+ `(helm-ff-dirs ((,class :inherit bold :foreground ,blue-alt-other)))
+ `(helm-ff-dotted-directory ((,class :inherit bold :background ,bg-alt :foreground ,fg-alt)))
+ `(helm-ff-dotted-symlink-directory ((,class :inherit helm-ff-dotted-directory :underline t)))
+ `(helm-ff-executable ((,class :foreground ,magenta-alt)))
+ `(helm-ff-file ((,class :foreground ,fg-main)))
+ `(helm-ff-file-extension ((,class :foreground ,fg-special-warm)))
+ `(helm-ff-invalid-symlink ((,class :foreground ,red :underline t)))
+ `(helm-ff-pipe ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-refine-magenta
+ 'modus-theme-subtle-magenta
+ 'modus-theme-nuanced-magenta
+ magenta))))
+ `(helm-ff-prefix ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-refine-yellow
+ 'modus-theme-subtle-yellow
+ 'modus-theme-nuanced-yellow
+ yellow-alt-other))))
+ `(helm-ff-socket ((,class :foreground ,red-alt-other)))
+ `(helm-ff-suid ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-red
+ 'modus-theme-refine-red
+ 'modus-theme-nuanced-yellow
+ red-alt))))
+ `(helm-ff-symlink ((,class :foreground ,cyan :underline t)))
+ `(helm-ff-truename ((,class :foreground ,blue-alt-other)))
+ `(helm-grep-cmd-line ((,class :foreground ,yellow-alt-other)))
+ `(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-header ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(helm-header-line-left-margin ((,class :inherit bold :foreground ,yellow-intense)))
+ `(helm-history-deleted ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-red
+ 'modus-theme-intense-red
+ 'modus-theme-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-vivendi-theme-extra-completions
+ 'modus-theme-subtle-yellow
+ 'modus-theme-refine-yellow
+ 'modus-theme-nuanced-yellow
+ yellow
+ 'bold))))
+ `(helm-locate-finish ((,class :foreground ,green-active)))
+ `(helm-match ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-cyan
+ 'modus-theme-refine-cyan
+ 'modus-theme-nuanced-cyan
+ cyan
+ 'bold))))
+ `(helm-match-item ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-neutral
+ 'modus-theme-subtle-cyan
+ 'modus-theme-nuanced-cyan
+ cyan-alt-other))))
+ `(helm-minibuffer-prompt ((,class :inherit minibuffer-prompt)))
+ `(helm-moccur-buffer ((,class :foreground ,cyan-alt-other :underline t)))
+ `(helm-mode-prefix ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-intense-magenta
+ 'modus-theme-nuanced-magenta
+ magenta-alt
+ 'bold))))
+ `(helm-non-file-buffer ((,class :foreground ,fg-alt)))
+ `(helm-prefarg ((,class :foreground ,red-active)))
+ `(helm-resume-need-update ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-refine-magenta
+ 'modus-theme-nuanced-magenta
+ magenta-alt-other))))
+ `(helm-selection ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-blue
+ 'modus-theme-refine-blue
+ 'modus-theme-special-cold
+ nil
+ 'bold))))
+ `(helm-selection-line ((,class :inherit modus-theme-special-cold)))
+ `(helm-separator ((,class :foreground ,fg-special-mild)))
+ `(helm-time-zone-current ((,class :foreground ,green)))
+ `(helm-time-zone-home ((,class :foreground ,magenta)))
+ `(helm-source-header ((,class :inherit bold :foreground ,red-alt
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-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-ls-git
+ `(helm-ls-git-added-copied-face ((,class :foreground ,green-intense)))
+ `(helm-ls-git-added-modified-face ((,class :foreground ,yellow-intense)))
+ `(helm-ls-git-conflict-face ((,class :inherit bold :foreground ,red-intense)))
+ `(helm-ls-git-deleted-and-staged-face ((,class :foreground ,red-nuanced)))
+ `(helm-ls-git-deleted-not-staged-face ((,class :foreground ,red)))
+ `(helm-ls-git-modified-and-staged-face ((,class :foreground ,yellow-nuanced)))
+ `(helm-ls-git-modified-not-staged-face ((,class :foreground ,yellow)))
+ `(helm-ls-git-renamed-modified-face ((,class :foreground ,magenta)))
+ `(helm-ls-git-untracked-face ((,class :foreground ,fg-special-cold)))
+;;;;; helm-switch-shell
+ `(helm-switch-shell-new-shell-face ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-refine-magenta
+ 'modus-theme-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 (bold ,modus-theme-variable-pitch) :foreground ,fg-main
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4))))
+;;;;; highlight region or ad-hoc regexp
+ `(hi-black-b ((,class :background ,fg-main :foreground ,bg-main)))
+ `(hi-blue ((,class :background ,bg-alt :foreground ,blue :underline t)))
+ `(hi-blue-b ((,class :inherit modus-theme-intense-blue)))
+ `(hi-green ((,class :background ,bg-alt :foreground ,green :underline t)))
+ `(hi-green-b ((,class :inherit modus-theme-intense-green)))
+ `(hi-pink ((,class :background ,bg-alt :foreground ,magenta :underline t)))
+ `(hi-red-b ((,class :inherit modus-theme-intense-red)))
+ `(hi-yellow ((,class :background ,bg-alt :foreground ,yellow :underline t)))
+ `(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-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)))
+ `(highlight-blocks-depth-3-face ((,class :background ,bg-special-cold :foreground ,fg-main)))
+ `(highlight-blocks-depth-4-face ((,class :background ,bg-special-calm :foreground ,fg-main)))
+ `(highlight-blocks-depth-5-face ((,class :background ,bg-special-warm :foreground ,fg-main)))
+ `(highlight-blocks-depth-6-face ((,class :background ,bg-special-mild :foreground ,fg-main)))
+ `(highlight-blocks-depth-7-face ((,class :background ,bg-inactive :foreground ,fg-main)))
+ `(highlight-blocks-depth-8-face ((,class :background ,bg-active :foreground ,fg-main)))
+ `(highlight-blocks-depth-9-face ((,class :background ,cyan-subtle-bg :foreground ,fg-main)))
+;;;;; highlight-defined
+ `(highlight-defined-builtin-function-name-face ((,class :foreground ,magenta)))
+ `(highlight-defined-face-name-face ((,class :foreground ,fg-main)))
+ `(highlight-defined-function-name-face ((,class :foreground ,magenta)))
+ `(highlight-defined-macro-name-face ((,class :foreground ,magenta-alt)))
+ `(highlight-defined-special-form-name-face ((,class :foreground ,magenta-alt-other)))
+ `(highlight-defined-variable-name-face ((,class :foreground ,cyan)))
+;;;;; highlight-escape-sequences (`hes-mode')
+ `(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-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-thing
+ `(highlight-thing ((,class :background ,bg-alt :foreground ,cyan)))
+;;;;; hl-defined
+ `(hdefd-functions ((,class :foreground ,blue)))
+ `(hdefd-undefined ((,class :foreground ,red-alt)))
+ `(hdefd-variables ((,class :foreground ,cyan-alt)))
+;;;;; hl-fill-column
+ `(hl-fill-column-face ((,class :background ,bg-active :foreground ,fg-active)))
+;;;;; hl-todo
+ `(hl-todo ((,class :inherit bold :foreground ,red-alt-other :slant ,modus-theme-slant)))
+;;;;; hydra
+ `(hydra-face-amaranth ((,class :inherit bold :foreground ,yellow)))
+ `(hydra-face-blue ((,class :inherit bold :foreground ,blue-alt)))
+ `(hydra-face-pink ((,class :inherit bold :foreground ,magenta-alt)))
+ `(hydra-face-red ((,class :inherit bold :foreground ,red)))
+ `(hydra-face-teal ((,class :inherit bold :foreground ,cyan)))
+;;;;; hyperlist
+ `(hyperlist-condition ((,class :foreground ,green)))
+ `(hyperlist-hashtag ((,class :foreground ,yellow)))
+ `(hyperlist-operator ((,class :foreground ,blue-alt)))
+ `(hyperlist-paren ((,class :foreground ,cyan-alt-other)))
+ `(hyperlist-quote ((,class :foreground ,cyan-alt)))
+ `(hyperlist-ref ((,class :foreground ,magenta-alt-other)))
+ `(hyperlist-stars ((,class :foreground ,fg-alt)))
+ `(hyperlist-tag ((,class :foreground ,red)))
+ `(hyperlist-toplevel ((,class :inherit bold :foreground ,fg-main)))
+;;;;; icomplete
+ `(icomplete-first-match ((,class :inherit bold
+ ,@(modus-vivendi-theme-standard-completions
+ magenta magenta-nuanced-bg
+ magenta-intense-bg fg-main))))
+;;;;; icomplete-vertical
+ `(icomplete-vertical-separator ((,class :foreground ,fg-alt)))
+;;;;; ido-mode
+ `(ido-first-match ((,class :inherit bold
+ ,@(modus-vivendi-theme-standard-completions
+ magenta magenta-nuanced-bg
+ magenta-subtle-bg fg-main))))
+ `(ido-incomplete-regexp ((,class :inherit error)))
+ `(ido-indicator ((,class :inherit modus-theme-subtle-yellow)))
+ `(ido-only-match ((,class :inherit bold
+ ,@(modus-vivendi-theme-standard-completions
+ magenta-intense red-nuanced-bg
+ magenta-intense-bg fg-main))))
+ `(ido-subdir ((,class :foreground ,blue-alt-other)))
+ `(ido-virtual ((,class :foreground ,yellow-alt-other)))
+;;;;; iedit
+ `(iedit-occurrence ((,class :inherit modus-theme-refine-blue)))
+ `(iedit-read-only-occurrence ((,class :inherit modus-theme-intense-yellow)))
+;;;;; iflipb
+ `(iflipb-current-buffer-face ((,class :inherit bold :foreground ,cyan-alt)))
+ `(iflipb-other-buffer-face ((,class :foreground ,fg-alt)))
+;;;;; imenu-list
+ `(imenu-list-entry-face-0 ((,class :foreground ,cyan)))
+ `(imenu-list-entry-face-1 ((,class :foreground ,blue)))
+ `(imenu-list-entry-face-2 ((,class :foreground ,cyan-alt-other)))
+ `(imenu-list-entry-face-3 ((,class :foreground ,blue-alt)))
+ `(imenu-list-entry-subalist-face-0 ((,class :inherit bold :foreground ,magenta-alt-other :underline t)))
+ `(imenu-list-entry-subalist-face-1 ((,class :inherit bold :foreground ,magenta :underline t)))
+ `(imenu-list-entry-subalist-face-2 ((,class :inherit bold :foreground ,green-alt-other :underline t)))
+ `(imenu-list-entry-subalist-face-3 ((,class :inherit bold :foreground ,red-alt-other :underline t)))
+;;;;; indium
+ `(indium-breakpoint-face ((,class :foreground ,red-active)))
+ `(indium-frame-url-face ((,class :foreground ,fg-alt :underline t)))
+ `(indium-keyword-face ((,class :foreground ,magenta-alt-other)))
+ `(indium-litable-face ((,class :foreground ,fg-special-warm :slant ,modus-theme-slant)))
+ `(indium-repl-error-face ((,class :inherit bold :foreground ,red)))
+ `(indium-repl-prompt-face ((,class :foreground ,cyan-alt-other)))
+ `(indium-repl-stdout-face ((,class :foreground ,fg-main)))
+;;;;; info
+ `(Info-quoted ((,class :foreground ,magenta))) ; the capitalisation is canonical
+ `(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 (bold ,modus-theme-variable-pitch) :foreground ,fg-main
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-2))))
+ `(info-menu-star ((,class :foreground ,fg-main)))
+ `(info-node ((,class :inherit bold)))
+ `(info-title-1 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-main
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4))))
+ `(info-title-2 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-warm
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-3))))
+ `(info-title-3 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-cold
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-2))))
+ `(info-title-4 ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-mild
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-1))))
+;;;;; info-colors
+ `(info-colors-lisp-code-block ((,class :inherit fixed-pitch)))
+ `(info-colors-ref-item-command ((,class :foreground ,magenta)))
+ `(info-colors-ref-item-constant ((,class :foreground ,blue-alt-other)))
+ `(info-colors-ref-item-function ((,class :foreground ,magenta)))
+ `(info-colors-ref-item-macro ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,magenta-alt-other)))
+ `(info-colors-ref-item-other ((,class :foreground ,cyan)))
+ `(info-colors-ref-item-special-form ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,magenta-alt-other)))
+ `(info-colors-ref-item-syntax-class ((,class :foreground ,magenta)))
+ `(info-colors-ref-item-type ((,class :foreground ,magenta-alt)))
+ `(info-colors-ref-item-user-option ((,class :foreground ,cyan)))
+ `(info-colors-ref-item-variable ((,class :foreground ,cyan)))
+;;;;; interaction-log
+ `(ilog-buffer-face ((,class :foreground ,magenta-alt-other)))
+ `(ilog-change-face ((,class :foreground ,magenta-alt)))
+ `(ilog-echo-face ((,class :foreground ,yellow-alt-other)))
+ `(ilog-load-face ((,class :foreground ,green)))
+ `(ilog-message-face ((,class :foreground ,fg-alt)))
+ `(ilog-non-change-face ((,class :foreground ,blue)))
+;;;;; 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 ,@(and (>= emacs-major-version 27) '(:extend t))
+ :inherit modus-theme-special-cold)))
+ `(ioccur-num-line-face ((,class :foreground ,fg-special-warm)))
+ `(ioccur-overlay-face ((,class ,@(and (>= emacs-major-version 27) '(:extend t))
+ :inherit modus-theme-refine-blue)))
+ `(ioccur-regexp-face ((,class :inherit (modus-theme-intense-magenta bold))))
+ `(ioccur-title-face ((,class :inherit bold :foreground ,red-alt
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4))))
+;;;;; isearch, occur, and the like
+ `(isearch ((,class :inherit (modus-theme-intense-green bold))))
+ `(isearch-fail ((,class :inherit modus-theme-refine-red)))
+ `(lazy-highlight ((,class :inherit modus-theme-refine-cyan)))
+ `(match ((,class :inherit modus-theme-special-calm)))
+ `(query-replace ((,class :inherit (modus-theme-intense-yellow bold))))
+;;;;; ivy
+ `(ivy-action ((,class :inherit bold :foreground ,red-alt)))
+ `(ivy-completions-annotations ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(ivy-confirm-face ((,class :foreground ,cyan)))
+ `(ivy-current-match ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-refine-cyan
+ 'modus-theme-intense-cyan
+ 'modus-theme-special-warm
+ nil
+ 'bold))))
+ `(ivy-cursor ((,class :background ,fg-main :foreground ,bg-main)))
+ `(ivy-grep-info ((,class :foreground ,cyan-alt)))
+ `(ivy-grep-line-number ((,class :foreground ,fg-special-warm)))
+ `(ivy-highlight-face ((,class :foreground ,magenta)))
+ `(ivy-match-required-face ((,class :inherit error)))
+ `(ivy-minibuffer-match-face-1 ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-neutral
+ 'modus-theme-intense-neutral
+ 'modus-theme-subtle-neutral
+ fg-alt))))
+ `(ivy-minibuffer-match-face-2 ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-green
+ 'modus-theme-refine-green
+ 'modus-theme-nuanced-green
+ green-alt-other
+ 'bold))))
+ `(ivy-minibuffer-match-face-3 ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-cyan
+ 'modus-theme-refine-cyan
+ 'modus-theme-nuanced-cyan
+ cyan-alt-other
+ 'bold))))
+ `(ivy-minibuffer-match-face-4 ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-refine-magenta
+ 'modus-theme-nuanced-magenta
+ magenta-alt-other
+ 'bold))))
+ `(ivy-minibuffer-match-highlight ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-blue
+ 'modus-theme-intense-blue
+ 'modus-theme-nuanced-blue
+ blue-alt-other
+ 'bold))))
+ `(ivy-modified-buffer ((,class :foreground ,yellow :slant ,modus-theme-slant)))
+ `(ivy-modified-outside-buffer ((,class :foreground ,yellow-alt :slant ,modus-theme-slant)))
+ `(ivy-org ((,class :foreground ,cyan-alt-other)))
+ `(ivy-prompt-match ((,class :inherit ivy-current-match)))
+ `(ivy-remote ((,class :foreground ,magenta)))
+ `(ivy-separator ((,class :foreground ,fg-alt)))
+ `(ivy-subdir ((,class :foreground ,blue-alt-other)))
+ `(ivy-virtual ((,class :foreground ,magenta-alt-other)))
+ `(ivy-yanked-word ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-blue
+ 'modus-theme-refine-blue
+ 'modus-theme-nuanced-blue
+ blue-alt))))
+;;;;; ivy-posframe
+ `(ivy-posframe ((,class :background ,bg-dim :foreground ,fg-main)))
+ `(ivy-posframe-border ((,class :background ,bg-active)))
+ `(ivy-posframe-cursor ((,class :background ,fg-main :foreground ,bg-main)))
+;;;;; 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-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-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)))
+;;;;; 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-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-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)))
+;;;;; julia
+ `(julia-macro-face ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,magenta)))
+ `(julia-quoted-symbol-face ((,class :foreground ,blue-alt-other)))
+;;;;; 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)))
+;;;;; 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 :box ,(modus-vivendi-theme-modeline-box blue-alt blue-active t -3)
+ ,@(modus-vivendi-theme-modeline-props
+ blue-active bg-main
+ blue-active bg-active))))
+;;;;; line numbers (display-line-numbers-mode and global variant)
+ `(line-number ((,class :background ,bg-dim :foreground ,fg-alt)))
+ `(line-number-current-line ((,class :inherit bold :background ,bg-active :foreground ,fg-active)))
+;;;;; 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-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-enummember ((,class :foreground ,blue-alt-other)))
+ `(lsp-face-semhl-field ((,class :foreground ,cyan-alt)))
+ `(lsp-face-semhl-field-static ((,class :foreground ,cyan-alt :slant ,modus-theme-slant)))
+ `(lsp-face-semhl-function ((,class :foreground ,magenta)))
+ `(lsp-face-semhl-method ((,class :foreground ,magenta)))
+ `(lsp-face-semhl-namespace ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,magenta-alt)))
+ `(lsp-face-semhl-preprocessor ((,class :foreground ,red-alt-other)))
+ `(lsp-face-semhl-static-method ((,class :foreground ,magenta :slant ,modus-theme-slant)))
+ `(lsp-face-semhl-type-class ((,class :foreground ,magenta-alt)))
+ `(lsp-face-semhl-type-enum ((,class :foreground ,magenta-alt)))
+ `(lsp-face-semhl-type-primitive ((,class :foreground ,magenta-alt :slant ,modus-theme-slant)))
+ `(lsp-face-semhl-type-template ((,class :foreground ,magenta-alt :slant ,modus-theme-slant)))
+ `(lsp-face-semhl-type-typedef ((,class :foreground ,magenta-alt :slant ,modus-theme-slant)))
+ `(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)))
+ `(lsp-lens-face ((,class :height 0.8 :foreground ,fg-alt)))
+ `(lsp-lens-mouse-face ((,class :height 0.8 :foreground ,blue-alt-other :underline t)))
+ `(lsp-ui-doc-background ((,class :background ,bg-alt)))
+ `(lsp-ui-doc-header ((,class :background ,bg-header :foreground ,fg-header)))
+ `(lsp-ui-doc-url ((,class :foreground ,blue-alt-other :underline t)))
+ `(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-line-number ((,class :foreground ,fg-alt)))
+ `(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-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)))
+ `(lsp-ui-sideline-symbol-info ((,class :height 0.99 :slant italic)))
+;;;;; magit
+ `(magit-bisect-bad ((,class :foreground ,red-alt-other)))
+ `(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 :foreground ,fg-alt)))
+ `(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-name ((,class :foreground ,magenta-alt-other)))
+ `(magit-blame-summary ((,class :foreground ,cyan-alt-other)))
+ `(magit-branch-current ((,class :foreground ,blue-alt-other :box t)))
+ `(magit-branch-local ((,class :foreground ,blue-alt)))
+ `(magit-branch-remote ((,class :foreground ,magenta-alt)))
+ `(magit-branch-remote-head ((,class :foreground ,magenta-alt-other :box t)))
+ `(magit-branch-upstream ((,class :slant italic)))
+ `(magit-cherry-equivalent ((,class :background ,bg-main :foreground ,magenta-intense)))
+ `(magit-cherry-unmatched ((,class :background ,bg-main :foreground ,cyan-intense)))
+ `(magit-diff-added ((,class ,@(modus-vivendi-theme-diffs
+ bg-main green
+ bg-diff-added fg-diff-added))))
+ `(magit-diff-added-highlight ((,class ,@(modus-vivendi-theme-diffs
+ bg-dim green
+ bg-diff-focus-added fg-diff-focus-added))))
+ `(magit-diff-base ((,class ,@(modus-vivendi-theme-diffs
+ bg-main yellow
+ bg-diff-changed fg-diff-changed))))
+ `(magit-diff-base-highlight ((,class ,@(modus-vivendi-theme-diffs
+ bg-dim yellow
+ bg-diff-focus-changed fg-diff-focus-changed))))
+ `(magit-diff-context ((,class :foreground ,fg-unfocused)))
+ `(magit-diff-context-highlight ((,class ,@(modus-vivendi-theme-diffs
+ bg-dim fg-dim
+ bg-inactive fg-inactive))))
+ `(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 :background ,bg-alt :foreground ,cyan)))
+ `(magit-diff-hunk-heading ((,class :inherit bold :background ,bg-active :foreground ,fg-inactive)))
+ `(magit-diff-hunk-heading-highlight ((,class :inherit (modus-theme-diff-heading bold))))
+ `(magit-diff-hunk-heading-selection ((,class :inherit modus-theme-intense-cyan)))
+ `(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-removed ((,class ,@(modus-vivendi-theme-diffs
+ bg-main red
+ bg-diff-removed fg-diff-removed))))
+ `(magit-diff-removed-highlight ((,class ,@(modus-vivendi-theme-diffs
+ bg-dim red
+ bg-diff-focus-removed fg-diff-focus-removed))))
+ `(magit-diffstat-added ((,class :foreground ,green)))
+ `(magit-diffstat-removed ((,class :foreground ,red)))
+ `(magit-dimmed ((,class :foreground ,fg-unfocused)))
+ `(magit-filename ((,class :foreground ,fg-special-cold)))
+ `(magit-hash ((,class :foreground ,fg-alt)))
+ `(magit-head ((,class :inherit magit-branch-local)))
+ `(magit-header-line ((,class :inherit bold :foreground ,magenta-active)))
+ `(magit-header-line-key ((,class :inherit bold :foreground ,red-active)))
+ `(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)))
+ `(magit-log-author ((,class :foreground ,cyan)))
+ `(magit-log-date ((,class :foreground ,fg-alt)))
+ `(magit-log-graph ((,class :foreground ,fg-dim)))
+ `(magit-mode-line-process ((,class :inherit bold :foreground ,blue-active)))
+ `(magit-mode-line-process-error ((,class :inherit bold :foreground ,red-active)))
+ `(magit-process-ng ((,class :inherit error)))
+ `(magit-process-ok ((,class :inherit success)))
+ `(magit-reflog-amend ((,class :background ,bg-main :foreground ,magenta-intense)))
+ `(magit-reflog-checkout ((,class :background ,bg-main :foreground ,blue-intense)))
+ `(magit-reflog-cherry-pick ((,class :background ,bg-main :foreground ,green-intense)))
+ `(magit-reflog-commit ((,class :background ,bg-main :foreground ,green-intense)))
+ `(magit-reflog-merge ((,class :background ,bg-main :foreground ,green-intense)))
+ `(magit-reflog-other ((,class :background ,bg-main :foreground ,cyan-intense)))
+ `(magit-reflog-rebase ((,class :background ,bg-main :foreground ,magenta-intense)))
+ `(magit-reflog-remote ((,class :background ,bg-main :foreground ,cyan-intense)))
+ `(magit-reflog-reset ((,class :background ,bg-main :foreground ,red-intense)))
+ `(magit-refname ((,class :foreground ,fg-alt)))
+ `(magit-refname-pullreq ((,class :foreground ,fg-alt)))
+ `(magit-refname-stash ((,class :foreground ,fg-alt)))
+ `(magit-refname-wip ((,class :foreground ,fg-alt)))
+ `(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-highlight ((,class :background ,bg-alt)))
+ `(magit-sequence-done ((,class :foreground ,green-alt)))
+ `(magit-sequence-drop ((,class :foreground ,red-alt)))
+ `(magit-sequence-exec ((,class :foreground ,magenta-alt)))
+ `(magit-sequence-head ((,class :foreground ,cyan-alt)))
+ `(magit-sequence-onto ((,class :foreground ,fg-alt)))
+ `(magit-sequence-part ((,class :foreground ,yellow-alt)))
+ `(magit-sequence-pick ((,class :foreground ,blue-alt)))
+ `(magit-sequence-stop ((,class :foreground ,red)))
+ `(magit-signature-bad ((,class :inherit bold :foreground ,red)))
+ `(magit-signature-error ((,class :foreground ,red-alt)))
+ `(magit-signature-expired ((,class :foreground ,yellow)))
+ `(magit-signature-expired-key ((,class :foreground ,yellow)))
+ `(magit-signature-good ((,class :foreground ,green)))
+ `(magit-signature-revoked ((,class :foreground ,magenta)))
+ `(magit-signature-untrusted ((,class :foreground ,cyan)))
+ `(magit-tag ((,class :foreground ,yellow-alt-other)))
+;;;;; magit-imerge
+ `(magit-imerge-overriding-value ((,class :inherit bold :foreground ,red-alt)))
+;;;;; man
+ `(Man-overstrike ((,class :inherit bold :foreground ,magenta)))
+ `(Man-reverse ((,class :inherit modus-theme-subtle-magenta)))
+ `(Man-underline ((,class :foreground ,cyan :underline t)))
+;;;;; markdown-mode
+ `(markdown-blockquote-face ((,class :foreground ,fg-special-warm :slant ,modus-theme-slant)))
+ `(markdown-bold-face ((,class :inherit bold)))
+ `(markdown-code-face ((,class :inherit fixed-pitch)))
+ `(markdown-comment-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(markdown-footnote-marker-face ((,class :inherit bold :foreground ,cyan-alt)))
+ `(markdown-footnote-text-face ((,class :foreground ,fg-main :slant ,modus-theme-slant)))
+ `(markdown-gfm-checkbox-face ((,class :foreground ,cyan-alt-other)))
+ `(markdown-header-delimiter-face ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,fg-dim)))
+ `(markdown-header-face ((,class :inherit bold)))
+ `(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 :inherit fixed-pitch :foreground ,cyan)))
+ `(markdown-html-attr-value-face ((,class :inherit fixed-pitch :foreground ,blue)))
+ `(markdown-html-entity-face ((,class :inherit fixed-pitch :foreground ,cyan)))
+ `(markdown-html-tag-delimiter-face ((,class :inherit fixed-pitch :foreground ,fg-special-mild)))
+ `(markdown-html-tag-name-face ((,class :inherit fixed-pitch :foreground ,magenta-alt)))
+ `(markdown-inline-code-face ((,class :inherit fixed-pitch :foreground ,magenta)))
+ `(markdown-italic-face ((,class :foreground ,fg-special-cold :slant italic)))
+ `(markdown-language-info-face ((,class :inherit fixed-pitch :foreground ,fg-special-cold)))
+ `(markdown-language-keyword-face ((,class :inherit fixed-pitch :foreground ,green-alt-other)))
+ `(markdown-line-break-face ((,class :inherit modus-theme-refine-cyan :underline t)))
+ `(markdown-link-face ((,class :inherit link)))
+ `(markdown-link-title-face ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(markdown-list-face ((,class :foreground ,fg-dim)))
+ `(markdown-markup-face ((,class :foreground ,fg-alt)))
+ `(markdown-math-face ((,class :foreground ,magenta-alt-other)))
+ `(markdown-metadata-key-face ((,class :foreground ,cyan-alt-other)))
+ `(markdown-metadata-value-face ((,class :foreground ,blue-alt)))
+ `(markdown-missing-link-face ((,class :inherit bold :foreground ,yellow)))
+ `(markdown-plain-url-face ((,class :inherit markdown-link-face)))
+ `(markdown-pre-face ((,class ,@(and (>= emacs-major-version 27) '(:extend t))
+ :inherit fixed-pitch :background ,bg-dim
+ :foreground ,fg-special-mild)))
+ `(markdown-reference-face ((,class :inherit markdown-markup-face)))
+ `(markdown-strike-through-face ((,class :strike-through t)))
+ `(markdown-table-face ((,class :inherit fixed-pitch :foreground ,fg-special-cold)))
+ `(markdown-url-face ((,class :foreground ,blue)))
+;;;;; markup-faces (`adoc-mode')
+ `(markup-anchor-face ((,class :foreground ,fg-inactive)))
+ `(markup-attribute-face ((,class :foreground ,fg-inactive :slant italic)))
+ `(markup-big-face ((,class :height 1.3 :foreground ,blue-nuanced)))
+ `(markup-bold-face ((,class :inherit bold :foreground ,red-nuanced)))
+ `(markup-code-face ((,class :inherit fixed-pitch :foreground ,magenta)))
+ `(markup-command-face ((,class :foreground ,fg-inactive)))
+ `(markup-comment-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(markup-complex-replacement-face ((,class :box (:line-width 2 :color nil :style released-button)
+ :inherit modus-theme-refine-magenta)))
+ `(markup-emphasis-face ((,class :foreground ,fg-special-cold :slant italic)))
+ `(markup-error-face ((,class :inherit bold :foreground ,red)))
+ `(markup-gen-face ((,class :foreground ,magenta-alt)))
+ `(markup-internal-reference-face ((,class :foreground ,fg-inactive :underline t)))
+ `(markup-italic-face ((,class :foreground ,fg-special-cold :slant italic)))
+ `(markup-list-face ((,class :inherit modus-theme-special-calm)))
+ `(markup-meta-face ((,class :foreground ,fg-inactive)))
+ `(markup-meta-hide-face ((,class :foreground ,fg-alt)))
+ `(markup-passthrough-face ((,class :inherit fixed-pitch :foreground ,cyan)))
+ `(markup-preprocessor-face ((,class :foreground ,red-alt-other)))
+ `(markup-replacement-face ((,class :foreground ,yellow-alt-other)))
+ `(markup-secondary-text-face ((,class :height 0.8 :foreground ,magenta-nuanced)))
+ `(markup-small-face ((,class :height 0.8 :foreground ,fg-main)))
+ `(markup-strong-face ((,class :inherit bold :foreground ,red-nuanced)))
+ `(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-title-0-face ((,class :height 3.0 :foreground ,blue-nuanced)))
+ `(markup-title-1-face ((,class :height 2.4 :foreground ,blue-nuanced)))
+ `(markup-title-2-face ((,class :height 1.8 :foreground ,blue-nuanced)))
+ `(markup-title-3-face ((,class :height 1.4 :foreground ,blue-nuanced)))
+ `(markup-title-4-face ((,class :height 1.2 :foreground ,blue-nuanced)))
+ `(markup-title-5-face ((,class :height 1.2 :foreground ,blue-nuanced :underline t)))
+ `(markup-value-face ((,class :foreground ,fg-inactive)))
+ `(markup-verbatim-face ((,class :inherit modus-theme-special-mild)))
+;;;;; mentor
+ `(mentor-download-message ((,class :foreground ,fg-special-warm)))
+ `(mentor-download-name ((,class :foreground ,fg-special-cold)))
+ `(mentor-download-progress ((,class :foreground ,blue-alt-other)))
+ `(mentor-download-size ((,class :foreground ,magenta-alt-other)))
+ `(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-tracker-name ((,class :foreground ,magenta-alt)))
+;;;;; messages
+ `(message-cited-text-1 ((,class :foreground ,blue-alt)))
+ `(message-cited-text-2 ((,class :foreground ,red-alt)))
+ `(message-cited-text-3 ((,class :foreground ,green-alt)))
+ `(message-cited-text-4 ((,class :foreground ,magenta-alt)))
+ `(message-header-cc ((,class :foreground ,blue-alt)))
+ `(message-header-name ((,class :foreground ,green-alt-other)))
+ `(message-header-newsgroups ((,class :inherit bold :foreground ,blue)))
+ `(message-header-other ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(message-header-subject ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(message-header-to ((,class :inherit bold :foreground ,magenta-alt)))
+ `(message-header-xheader ((,class :foreground ,blue-alt-other)))
+ `(message-mml ((,class :foreground ,green-alt)))
+ `(message-separator ((,class :background ,bg-active :foreground ,fg-special-warm)))
+;;;;; minibuffer-line
+ `(minibuffer-line ((,class :foreground ,fg-main)))
+;;;;; minimap
+ `(minimap-active-region-background ((,class :background ,bg-active)))
+ `(minimap-current-line-face ((,class :background ,cyan-intense-bg :foreground ,fg-main)))
+;;;;; modeline
+ `(mode-line ((,class :box ,(modus-vivendi-theme-modeline-box bg-active fg-alt t)
+ ,@(modus-vivendi-theme-modeline-props
+ bg-active fg-dim
+ bg-active fg-active))))
+ `(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-inactive ((,class :box ,(modus-vivendi-theme-modeline-box bg-active bg-region)
+ ,@(modus-vivendi-theme-modeline-props
+ bg-dim fg-inactive
+ bg-inactive fg-inactive))))
+;;;;; mood-line
+ `(mood-line-modified ((,class :foreground ,magenta-active)))
+ `(mood-line-status-error ((,class :inherit bold :foreground ,red-active)))
+ `(mood-line-status-info ((,class :foreground ,cyan-active)))
+ `(mood-line-status-neutral ((,class :foreground ,blue-active)))
+ `(mood-line-status-success ((,class :foreground ,green-active)))
+ `(mood-line-status-warning ((,class :inherit bold :foreground ,yellow-active)))
+ `(mood-line-unimportant ((,class :foreground ,fg-inactive)))
+;;;;; mu4e
+ `(mu4e-attach-number-face ((,class :inherit bold :foreground ,cyan-alt)))
+ `(mu4e-cited-1-face ((,class :foreground ,blue-alt)))
+ `(mu4e-cited-2-face ((,class :foreground ,red-alt)))
+ `(mu4e-cited-3-face ((,class :foreground ,green-alt)))
+ `(mu4e-cited-4-face ((,class :foreground ,magenta-alt)))
+ `(mu4e-cited-5-face ((,class :foreground ,yellow-alt)))
+ `(mu4e-cited-6-face ((,class :foreground ,cyan-alt)))
+ `(mu4e-cited-7-face ((,class :foreground ,magenta)))
+ `(mu4e-compose-header-face ((,class :inherit mu4e-compose-separator-face)))
+ `(mu4e-compose-separator-face ((,class :background ,bg-active :foreground ,fg-special-warm)))
+ `(mu4e-contact-face ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(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 :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(mu4e-forwarded-face ((,class :foreground ,magenta-alt-other)))
+ `(mu4e-header-face ((,class :foreground ,fg-alt)))
+ `(mu4e-header-highlight-face ((,class :inherit modus-theme-hl-line)))
+ `(mu4e-header-key-face ((,class :foreground ,cyan)))
+ `(mu4e-header-marks-face ((,class :inherit bold :foreground ,magenta-alt)))
+ `(mu4e-header-title-face ((,class :foreground ,fg-special-mild)))
+ `(mu4e-header-value-face ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(mu4e-highlight-face ((,class :inherit bold :foreground ,blue-alt-other)))
+ `(mu4e-link-face ((,class :inherit link)))
+ `(mu4e-modeline-face ((,class :foreground ,magenta-active)))
+ `(mu4e-moved-face ((,class :foreground ,yellow :slant ,modus-theme-slant)))
+ `(mu4e-ok-face ((,class :inherit bold :foreground ,green)))
+ `(mu4e-region-code ((,class :inherit modus-theme-special-calm)))
+ `(mu4e-replied-face ((,class :foreground ,cyan-active)))
+ `(mu4e-special-header-value-face ((,class :inherit bold :foreground ,blue-alt-other)))
+ `(mu4e-system-face ((,class :foreground ,fg-mark-del :slant ,modus-theme-slant)))
+ `(mu4e-title-face ((,class :foreground ,fg-main)))
+ `(mu4e-trashed-face ((,class :foreground ,red)))
+ `(mu4e-unread-face ((,class :inherit bold :foreground ,fg-main)))
+ `(mu4e-url-number-face ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(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-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)))
+ `(mu4e-conversation-sender-4 ((,class :foreground ,fg-alt)))
+ `(mu4e-conversation-sender-5 ((,class :foreground ,yellow-refine-fg)))
+ `(mu4e-conversation-sender-6 ((,class :foreground ,cyan-refine-fg)))
+ `(mu4e-conversation-sender-7 ((,class :foreground ,green-refine-fg)))
+ `(mu4e-conversation-sender-8 ((,class :foreground ,blue-refine-fg)))
+ `(mu4e-conversation-sender-me ((,class :foreground ,fg-main)))
+ `(mu4e-conversation-unread ((,class :inherit bold)))
+;;;;; multiple-cursors
+ `(mc/cursor-bar-face ((,class :height 1 :background ,fg-main)))
+ `(mc/cursor-face ((,class :inverse-video t)))
+ `(mc/region-face ((,class :inherit region)))
+;;;;; neotree
+ `(neo-banner-face ((,class :foreground ,magenta)))
+ `(neo-button-face ((,class :inherit button)))
+ `(neo-dir-link-face ((,class :inherit bold :foreground ,blue)))
+ `(neo-expand-btn-face ((,class :foreground ,cyan)))
+ `(neo-file-link-face ((,class :foreground ,fg-main)))
+ `(neo-header-face ((,class :inherit bold :foreground ,fg-main)))
+ `(neo-root-dir-face ((,class :inherit bold :foreground ,cyan-alt)))
+ `(neo-vc-added-face ((,class :foreground ,green)))
+ `(neo-vc-conflict-face ((,class :inherit bold :foreground ,red)))
+ `(neo-vc-default-face ((,class :foreground ,fg-main)))
+ `(neo-vc-edited-face ((,class :foreground ,yellow)))
+ `(neo-vc-ignored-face ((,class :foreground ,fg-inactive)))
+ `(neo-vc-missing-face ((,class :foreground ,red-alt)))
+ `(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-up-to-date-face ((,class :foreground ,fg-alt)))
+ `(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-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-hello-logo-background ((,class :background ,bg-main)))
+ `(notmuch-message-summary-face ((,class :inherit modus-theme-nuanced-cyan)))
+ `(notmuch-search-flagged-face ((,class :foreground ,red-alt)))
+ `(notmuch-search-matching-authors ((,class :foreground ,fg-main)))
+ `(notmuch-search-non-matching-authors ((,class :foreground ,fg-alt)))
+ `(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-face ((,class :inherit bold :foreground ,blue-alt)))
+ `(notmuch-tag-flagged ((,class :foreground ,red-alt)))
+ `(notmuch-tag-unread ((,class :foreground ,magenta-alt)))
+ `(notmuch-tree-match-author-face ((,class :foreground ,fg-special-cold)))
+ `(notmuch-tree-match-face ((,class :foreground ,fg-main)))
+ `(notmuch-tree-match-tag-face ((,class :inherit bold :foreground ,blue-alt)))
+ `(notmuch-tree-no-match-face ((,class :foreground ,fg-alt)))
+ `(notmuch-wash-cited-text ((,class :foreground ,cyan)))
+ `(notmuch-wash-toggle-button ((,class :background ,bg-alt :foreground ,fg-alt)))
+;;;;; num3-mode
+ `(num3-face-even ((,class :inherit bold :background ,bg-alt)))
+;;;;; nxml-mode
+ `(nxml-attribute-colon ((,class :foreground ,fg-main)))
+ `(nxml-attribute-local-name ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan-alt cyan-alt-faint))))
+ `(nxml-attribute-prefix ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(nxml-attribute-value ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue blue-faint))))
+ `(nxml-cdata-section-CDATA ((,class ,@(modus-vivendi-theme-syntax-foreground
+ red-alt red-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(nxml-cdata-section-delimiter ((,class ,@(modus-vivendi-theme-syntax-foreground
+ red-alt red-alt-faint))))
+ `(nxml-char-ref-delimiter ((,class ,@(modus-vivendi-theme-syntax-foreground
+ green-alt-other green-alt-other-faint))))
+ `(nxml-char-ref-number ((,class ,@(modus-vivendi-theme-syntax-foreground
+ green-alt-other green-alt-other-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(nxml-delimited-data ((,class :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(nxml-delimiter ((,class :foreground ,fg-dim)))
+ `(nxml-element-colon ((,class :foreground ,fg-main)))
+ `(nxml-element-local-name ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(nxml-element-prefix ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(nxml-entity-ref-delimiter ((,class ,@(modus-vivendi-theme-syntax-foreground
+ green-alt-other green-alt-other-faint))))
+ `(nxml-entity-ref-name ((,class ,@(modus-vivendi-theme-syntax-foreground
+ green-alt-other green-alt-other-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(nxml-glyph ((,class :inherit modus-theme-intense-neutral)))
+ `(nxml-hash ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue-alt blue-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(nxml-heading ((,class :inherit bold)))
+ `(nxml-name ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(nxml-namespace-attribute-colon ((,class :foreground ,fg-main)))
+ `(nxml-namespace-attribute-prefix ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(nxml-processing-instruction-target ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(nxml-prolog-keyword ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(nxml-ref ((,class ,@(modus-vivendi-theme-syntax-foreground
+ green-alt-other green-alt-other-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+;;;;; orderless
+ `(orderless-match-face-0 ((,class :inherit bold
+ ,@(modus-vivendi-theme-standard-completions
+ blue-alt blue-nuanced-bg
+ blue-refine-bg blue-refine-fg))))
+ `(orderless-match-face-1 ((,class :inherit bold
+ ,@(modus-vivendi-theme-standard-completions
+ magenta-alt magenta-nuanced-bg
+ magenta-refine-bg magenta-refine-fg))))
+ `(orderless-match-face-2 ((,class :inherit bold
+ ,@(modus-vivendi-theme-standard-completions
+ green-alt-other green-nuanced-bg
+ green-refine-bg green-refine-fg))))
+ `(orderless-match-face-3 ((,class :inherit bold
+ ,@(modus-vivendi-theme-standard-completions
+ yellow-alt-other yellow-nuanced-bg
+ yellow-refine-bg yellow-refine-fg))))
+;;;;; 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)))
+ `(org-agenda-column-dateline ((,class :background ,bg-alt)))
+ `(org-agenda-current-time ((,class :inherit modus-theme-subtle-cyan)))
+ `(org-agenda-date ((,class :inherit ,modus-theme-variable-pitch :foreground ,cyan-alt-other
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4)
+ ,@(modus-vivendi-theme-heading-block cyan-nuanced-bg cyan-nuanced))))
+ `(org-agenda-date-today ((,class :inherit (bold ,modus-theme-variable-pitch)
+ :background ,cyan-intense-bg :foreground ,fg-main
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4))))
+ `(org-agenda-date-weekend ((,class :inherit ,modus-theme-variable-pitch :foreground ,cyan
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4)
+ ,@(modus-vivendi-theme-heading-block blue-nuanced-bg cyan-nuanced))))
+ `(org-agenda-diary ((,class :foreground ,fg-main)))
+ `(org-agenda-dimmed-todo-face ((,class :inherit modus-theme-subtle-neutral)))
+ `(org-agenda-done ((,class ,@(modus-vivendi-theme-org-todo-block green-nuanced-bg green-nuanced green))))
+ `(org-agenda-filter-category ((,class :inherit bold :foreground ,magenta-active)))
+ `(org-agenda-filter-effort ((,class :inherit bold :foreground ,magenta-active)))
+ `(org-agenda-filter-regexp ((,class :inherit bold :foreground ,magenta-active)))
+ `(org-agenda-filter-tags ((,class :inherit bold :foreground ,magenta-active)))
+ `(org-agenda-restriction-lock ((,class :background ,bg-dim :foreground ,fg-dim)))
+ `(org-agenda-structure ((,class :inherit ,modus-theme-variable-pitch
+ :foreground ,fg-special-mild
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-3))))
+ `(org-archived ((,class :background ,bg-alt :foreground ,fg-alt)))
+ `(org-block ((,class ,@(modus-vivendi-theme-org-block bg-dim)
+ :inherit fixed-pitch :foreground ,fg-main)))
+ `(org-block-begin-line ((,class ,@(modus-vivendi-theme-org-block-delim
+ bg-dim fg-special-cold
+ bg-alt fg-special-mild)
+ :inherit fixed-pitch)))
+ `(org-block-end-line ((,class :inherit org-block-begin-line)))
+ `(org-checkbox ((,class :box (:line-width 1 :color ,bg-active)
+ :background ,bg-inactive :foreground ,fg-active)))
+ `(org-checkbox-statistics-done ((,class :foreground ,green
+ ,@(modus-vivendi-theme-heading-block
+ green-nuanced-bg green-nuanced))))
+ `(org-checkbox-statistics-todo ((,class ,@(modus-vivendi-theme-heading-foreground red-alt red)
+ ,@(modus-vivendi-theme-heading-block
+ red-nuanced-bg red-nuanced))))
+ `(org-clock-overlay ((,class :inherit modus-theme-special-cold)))
+ `(org-code ((,class :inherit fixed-pitch :foreground ,magenta)))
+ `(org-column ((,class :background ,bg-alt)))
+ `(org-column-title ((,class :inherit bold :underline t :background ,bg-alt)))
+ `(org-date ((,class :inherit fixed-pitch :foreground ,cyan-alt-other :underline t)))
+ `(org-date-selected ((,class :inherit bold :foreground ,blue-alt :inverse-video t)))
+ `(org-default ((,class :background ,bg-main :foreground ,fg-main)))
+ `(org-document-info ((,class :foreground ,fg-special-cold)))
+ `(org-document-info-keyword ((,class :inherit fixed-pitch :foreground ,fg-alt)))
+ `(org-document-title ((,class :inherit (bold ,modus-theme-variable-pitch) :foreground ,fg-special-cold
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-5))))
+ `(org-done ((,class ,@(modus-vivendi-theme-org-todo-block green-nuanced-bg green-nuanced green))))
+ `(org-drawer ((,class :foreground ,cyan-alt)))
+ `(org-ellipsis ((,class :foreground nil))) ; inherits from the heading's colour
+ `(org-footnote ((,class :foreground ,blue-alt :underline t)))
+ `(org-formula ((,class :inherit fixed-pitch :foreground ,red-alt)))
+ `(org-habit-alert-face ((,class :inherit modus-theme-intense-yellow)))
+ `(org-habit-alert-future-face ((,class :inherit modus-theme-refine-yellow)))
+ `(org-habit-clear-face ((,class :inherit modus-theme-intense-magenta)))
+ `(org-habit-clear-future-face ((,class :inherit modus-theme-refine-magenta)))
+ `(org-habit-overdue-face ((,class :inherit modus-theme-intense-red)))
+ `(org-habit-overdue-future-face ((,class :inherit modus-theme-refine-red)))
+ `(org-habit-ready-face ((,class :inherit modus-theme-intense-blue)))
+ `(org-habit-ready-future-face ((,class :inherit modus-theme-refine-blue)))
+ `(org-headline-done ((,class :foreground ,green-nuanced
+ ,@(modus-vivendi-theme-heading-block
+ green-nuanced-bg green-nuanced))))
+ `(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 (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-main magenta-alt-other)
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4)
+ ,@(modus-vivendi-theme-heading-block magenta-nuanced-bg magenta-nuanced))))
+ `(org-level-2 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-special-warm magenta-alt)
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-3)
+ ,@(modus-vivendi-theme-heading-block red-nuanced-bg red-nuanced))))
+ `(org-level-3 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-special-cold blue)
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-2)
+ ,@(modus-vivendi-theme-heading-block blue-nuanced-bg blue-nuanced))))
+ `(org-level-4 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-special-mild cyan)
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-1)
+ ,@(modus-vivendi-theme-heading-block cyan-nuanced-bg cyan-nuanced))))
+ `(org-level-5 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-special-calm green-alt-other)
+ ,@(modus-vivendi-theme-heading-block green-nuanced-bg green-nuanced))))
+ `(org-level-6 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground yellow-nuanced yellow-alt-other)
+ ,@(modus-vivendi-theme-heading-block yellow-nuanced-bg yellow-nuanced))))
+ `(org-level-7 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground red-nuanced red-alt)
+ ,@(modus-vivendi-theme-heading-block red-nuanced-bg red-nuanced))))
+ `(org-level-8 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-dim magenta)
+ ,@(modus-vivendi-theme-heading-block bg-alt fg-alt))))
+ `(org-link ((,class :inherit link)))
+ `(org-list-dt ((,class :inherit bold)))
+ `(org-macro ((,class :inherit org-latex-and-related)))
+ `(org-meta-line ((,class :inherit fixed-pitch :background ,cyan-nuanced-bg :foreground ,cyan-nuanced)))
+ `(org-mode-line-clock ((,class :foreground ,fg-main)))
+ `(org-mode-line-clock-overrun ((,class :inherit modus-theme-active-red)))
+ `(org-priority ((,class ,@(modus-vivendi-theme-org-todo-block magenta-nuanced-bg magenta-nuanced magenta)
+ ,@(modus-vivendi-theme-heading-foreground magenta magenta-alt-other))))
+ `(org-quote ((,class ,@(if modus-vivendi-theme-org-blocks
+ (append
+ (and (>= emacs-major-version 27) '(:extend t))
+ (list :background bg-dim))
+ (list :background nil))
+ :foreground ,fg-special-calm :slant ,modus-theme-slant)))
+ `(org-scheduled ((,class :foreground ,fg-special-warm)))
+ `(org-scheduled-previously ((,class :foreground ,yellow-alt-other)))
+ `(org-scheduled-today ((,class :foreground ,magenta-alt-other)))
+ `(org-sexp-date ((,class :inherit org-date)))
+ `(org-special-keyword ((,class ,@(modus-vivendi-theme-org-todo-block cyan-nuanced-bg cyan-nuanced cyan-alt))))
+ `(org-table ((,class :inherit fixed-pitch :foreground ,fg-special-cold)))
+ `(org-tag ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,magenta-nuanced)))
+ `(org-tag-group ((,class :inherit bold :foreground ,cyan-nuanced)))
+ `(org-target ((,class :underline t)))
+ `(org-time-grid ((,class :foreground ,fg-unfocused)))
+ `(org-todo ((,class ,@(modus-vivendi-theme-org-todo-block red-nuanced-bg red-nuanced red-alt)
+ ,@(modus-vivendi-theme-heading-foreground red-alt red))))
+ `(org-upcoming-deadline ((,class :foreground ,red-alt-other)))
+ `(org-upcoming-distant-deadline ((,class :foreground ,red-nuanced)))
+ `(org-verbatim ((,class :inherit fixed-pitch :background ,bg-alt :foreground ,fg-special-calm)))
+ `(org-verse ((,class :inherit org-quote)))
+ `(org-warning ((,class :inherit bold :foreground ,red-alt-other)))
+;;;;; org-journal
+ `(org-journal-calendar-entry-face ((,class :foreground ,yellow-alt-other :slant ,modus-theme-slant)))
+ `(org-journal-calendar-scheduled-face ((,class :foreground ,red-alt-other :slant ,modus-theme-slant)))
+ `(org-journal-highlight ((,class :foreground ,magenta-alt)))
+;;;;; org-noter
+ `(org-noter-no-notes-exist-face ((,class :inherit bold :foreground ,red-active)))
+ `(org-noter-notes-exist-face ((,class :inherit bold :foreground ,green-active)))
+;;;;; org-pomodoro
+ `(org-pomodoro-mode-line ((,class :foreground ,red-active)))
+ `(org-pomodoro-mode-line-break ((,class :foreground ,cyan-active)))
+ `(org-pomodoro-mode-line-overtime ((,class :inherit bold :foreground ,red-active)))
+;;;;; org-recur
+ `(org-recur ((,class :foreground ,magenta-active)))
+;;;;; org-roam
+ `(org-roam-link ((,class :foreground ,blue-alt-other :underline t)))
+ `(org-roam-backlink ((,class :foreground ,green-alt-other :underline t)))
+;;;;; org-superstar
+ `(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-treescope
+ `(org-treescope-faces--markerinternal-midday ((,class :inherit modus-theme-intense-blue)))
+ `(org-treescope-faces--markerinternal-range ((,class :inherit modus-theme-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 (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-main magenta-alt-other)
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4)
+ ,@(modus-vivendi-theme-heading-block magenta-nuanced-bg magenta-nuanced))))
+ `(outline-2 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-special-warm magenta-alt)
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-3)
+ ,@(modus-vivendi-theme-heading-block red-nuanced-bg red-nuanced))))
+ `(outline-3 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-special-cold blue)
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-2)
+ ,@(modus-vivendi-theme-heading-block blue-nuanced-bg blue-nuanced))))
+ `(outline-4 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-special-mild cyan)
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-1)
+ ,@(modus-vivendi-theme-heading-block cyan-nuanced-bg cyan-nuanced))))
+ `(outline-5 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-special-calm green-alt-other)
+ ,@(modus-vivendi-theme-heading-block green-nuanced-bg green-nuanced))))
+ `(outline-6 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground yellow-nuanced yellow-alt-other)
+ ,@(modus-vivendi-theme-heading-block yellow-nuanced-bg yellow-nuanced))))
+ `(outline-7 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground red-nuanced red-alt)
+ ,@(modus-vivendi-theme-heading-block red-nuanced-bg red-nuanced))))
+ `(outline-8 ((,class :inherit (bold ,modus-theme-variable-pitch)
+ ,@(modus-vivendi-theme-heading-foreground fg-dim magenta)
+ ,@(modus-vivendi-theme-heading-block bg-alt fg-alt))))
+;;;;; outline-minor-faces
+ `(outline-minor-0 ((,class ,@(unless modus-vivendi-theme-section-headings
+ (list :background cyan-nuanced-bg)))))
+;;;;; package (M-x list-packages)
+ `(package-description ((,class :foreground ,fg-special-cold)))
+ `(package-help-section-name ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(package-name ((,class :inherit link)))
+ `(package-status-avail-obso ((,class :inherit bold :foreground ,red)))
+ `(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-external ((,class :foreground ,cyan-alt-other)))
+ `(package-status-held ((,class :foreground ,yellow-alt)))
+ `(package-status-incompat ((,class :inherit bold :foreground ,yellow)))
+ `(package-status-installed ((,class :foreground ,fg-special-warm)))
+ `(package-status-new ((,class :inherit bold :foreground ,green)))
+ `(package-status-unsigned ((,class :inherit bold :foreground ,red-alt)))
+;;;;; page-break-lines
+ `(page-break-lines ((,class :inherit default :foreground ,fg-window-divider-outer)))
+;;;;; paradox
+ `(paradox-archive-face ((,class :foreground ,fg-special-mild)))
+ `(paradox-comment-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(paradox-commit-tag-face ((,class :inherit modus-theme-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 ,@(modus-vivendi-theme-bold-weight) :foreground ,blue-alt-other)))
+ `(paradox-highlight-face ((,class ,@(modus-vivendi-theme-bold-weight) :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)))
+ `(paradox-star-face ((,class :foreground ,magenta)))
+ `(paradox-starred-face ((,class :foreground ,magenta-alt)))
+;;;;; paren-face
+ `(parenthesis ((,class :foreground ,fg-unfocused)))
+;;;;; parrot
+ `(parrot-rotate-rotation-highlight-face ((,class :inherit modus-theme-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)))
+ `(pass-mode-header-face ((,class :foreground ,fg-special-warm)))
+;;;;; persp-mode
+ `(persp-face-lighter-buffer-not-in-persp ((,class :inherit modus-theme-intense-red)))
+ `(persp-face-lighter-default ((,class :inherit bold :foreground ,blue-active)))
+ `(persp-face-lighter-nil-persp ((,class :inherit bold :foreground ,fg-active)))
+;;;;; perspective
+ `(persp-selected-face ((,class :inherit bold :foreground ,blue-active)))
+;;;;; phi-grep
+ `(phi-grep-heading-face ((,class :inherit bold :foreground ,red-alt
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-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-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))))
+;;;;; pkgbuild-mode
+ `(pkgbuild-error-face ((,class :underline ,fg-lang-error)))
+;;;;; pomidor
+ `(pomidor-break-face ((,class :foreground ,blue-alt-other)))
+ `(pomidor-overwork-face ((,class :foreground ,red-alt-other)))
+ `(pomidor-skip-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(pomidor-work-face ((,class :foreground ,green-alt-other)))
+;;;;; powerline
+ `(powerline-active0 ((,class :background ,bg-main :foreground ,blue-faint :inverse-video t)))
+ `(powerline-active1 ((,class :background ,blue-nuanced-bg :foreground ,blue-nuanced)))
+ `(powerline-active2 ((,class :background ,bg-active :foreground ,fg-active)))
+ `(powerline-inactive0 ((,class :background ,bg-special-cold :foreground ,fg-special-cold)))
+ `(powerline-inactive1 ((,class :background ,bg-dim :foreground ,fg-inactive)))
+ `(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-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)))
+;;;;; proced
+ `(proced-mark ((,class :inherit modus-theme-mark-symbol)))
+ `(proced-marked ((,class :inherit modus-theme-mark-alt)))
+ `(proced-sort-header ((,class :inherit bold :foreground ,fg-special-calm :underline t)))
+;;;;; prodigy
+ `(prodigy-green-face ((,class :foreground ,green)))
+ `(prodigy-red-face ((,class :foreground ,red)))
+ `(prodigy-yellow-face ((,class :foreground ,yellow)))
+;;;;; rainbow-blocks
+ `(rainbow-blocks-depth-1-face ((,class :foreground ,magenta-alt-other)))
+ `(rainbow-blocks-depth-2-face ((,class :foreground ,blue)))
+ `(rainbow-blocks-depth-3-face ((,class :foreground ,magenta-alt)))
+ `(rainbow-blocks-depth-4-face ((,class :foreground ,green)))
+ `(rainbow-blocks-depth-5-face ((,class :foreground ,magenta)))
+ `(rainbow-blocks-depth-6-face ((,class :foreground ,cyan)))
+ `(rainbow-blocks-depth-7-face ((,class :foreground ,yellow)))
+ `(rainbow-blocks-depth-8-face ((,class :foreground ,cyan-alt)))
+ `(rainbow-blocks-depth-9-face ((,class :foreground ,red-alt)))
+ `(rainbow-blocks-unmatched-face ((,class :foreground ,red)))
+;;;;; rainbow-identifiers
+ `(rainbow-identifiers-identifier-1 ((,class :foreground ,green-alt-other)))
+ `(rainbow-identifiers-identifier-2 ((,class :foreground ,magenta-alt-other)))
+ `(rainbow-identifiers-identifier-3 ((,class :foreground ,cyan-alt-other)))
+ `(rainbow-identifiers-identifier-4 ((,class :foreground ,yellow-alt-other)))
+ `(rainbow-identifiers-identifier-5 ((,class :foreground ,blue-alt-other)))
+ `(rainbow-identifiers-identifier-6 ((,class :foreground ,green-alt)))
+ `(rainbow-identifiers-identifier-7 ((,class :foreground ,magenta-alt)))
+ `(rainbow-identifiers-identifier-8 ((,class :foreground ,cyan-alt)))
+ `(rainbow-identifiers-identifier-9 ((,class :foreground ,yellow-alt)))
+ `(rainbow-identifiers-identifier-10 ((,class :foreground ,green)))
+ `(rainbow-identifiers-identifier-11 ((,class :foreground ,magenta)))
+ `(rainbow-identifiers-identifier-12 ((,class :foreground ,cyan)))
+ `(rainbow-identifiers-identifier-13 ((,class :foreground ,yellow)))
+ `(rainbow-identifiers-identifier-14 ((,class :foreground ,blue-alt)))
+ `(rainbow-identifiers-identifier-15 ((,class :foreground ,red-alt)))
+;;;;; rainbow-delimiters
+ `(rainbow-delimiters-base-face-error ((,class :foreground ,red)))
+ `(rainbow-delimiters-base-face ((,class :foreground ,fg-main)))
+ `(rainbow-delimiters-depth-1-face ((,class :foreground ,green-alt-other)))
+ `(rainbow-delimiters-depth-2-face ((,class :foreground ,magenta-alt-other)))
+ `(rainbow-delimiters-depth-3-face ((,class :foreground ,cyan-alt-other)))
+ `(rainbow-delimiters-depth-4-face ((,class :foreground ,yellow-alt-other)))
+ `(rainbow-delimiters-depth-5-face ((,class :foreground ,blue-alt-other)))
+ `(rainbow-delimiters-depth-6-face ((,class :foreground ,green-alt)))
+ `(rainbow-delimiters-depth-7-face ((,class :foreground ,magenta-alt)))
+ `(rainbow-delimiters-depth-8-face ((,class :foreground ,cyan-alt)))
+ `(rainbow-delimiters-depth-9-face ((,class :foreground ,yellow-alt)))
+ `(rainbow-delimiters-mismatched-face ((,class :inherit bold :foreground ,red-alt)))
+ `(rainbow-delimiters-unmatched-face ((,class :inherit bold :foreground ,red)))
+;;;;; rcirc
+ `(rcirc-bright-nick ((,class :inherit bold :foreground ,magenta-alt)))
+ `(rcirc-dim-nick ((,class :foreground ,fg-alt)))
+ `(rcirc-my-nick ((,class :inherit bold :foreground ,magenta)))
+ `(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-server ((,class :foreground ,fg-unfocused)))
+ `(rcirc-timestamp ((,class :foreground ,blue-nuanced)))
+ `(rcirc-url ((,class :foreground ,blue :underline t)))
+;;;;; regexp-builder (re-builder)
+ `(reb-match-0 ((,class :inherit modus-theme-intense-blue)))
+ `(reb-match-1 ((,class :inherit modus-theme-intense-magenta)))
+ `(reb-match-2 ((,class :inherit modus-theme-intense-green)))
+ `(reb-match-3 ((,class :inherit modus-theme-intense-red)))
+ `(reb-regexp-grouping-backslash ((,class :inherit bold :foreground ,fg-escape-char-backslash)))
+ `(reb-regexp-grouping-construct ((,class :inherit bold :foreground ,fg-escape-char-construct)))
+;;;;; rg (rg.el)
+ `(rg-column-number-face ((,class :foreground ,magenta-alt-other)))
+ `(rg-context-face ((,class :foreground ,fg-unfocused)))
+ `(rg-error-face ((,class :inherit bold :foreground ,red)))
+ `(rg-file-tag-face ((,class :foreground ,fg-special-cold)))
+ `(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-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)))
+ `(rg-warning-face ((,class :inherit bold :foreground ,yellow)))
+;;;;; ripgrep
+ `(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)))
+;;;;; rmail
+ `(rmail-header-name ((,class :foreground ,cyan-alt-other)))
+ `(rmail-highlight ((,class :inherit bold :foreground ,magenta-alt)))
+;;;;; ruler-mode
+ `(ruler-mode-column-number ((,class :inherit (ruler-mode-default bold) :foreground ,fg-main)))
+ `(ruler-mode-comment-column ((,class :inherit ruler-mode-default :foreground ,red-active)))
+ `(ruler-mode-current-column ((,class :inherit ruler-mode-default :foreground ,cyan-active :box t)))
+ `(ruler-mode-default ((,class :background ,bg-inactive :foreground ,fg-inactive)))
+ `(ruler-mode-fill-column ((,class :inherit ruler-mode-default :foreground ,green-active)))
+ `(ruler-mode-fringes ((,class :inherit ruler-mode-default :foreground ,blue-active)))
+ `(ruler-mode-goal-column ((,class :inherit ruler-mode-default :foreground ,magenta-active)))
+ `(ruler-mode-margins ((,class :inherit ruler-mode-default :foreground ,bg-main)))
+ `(ruler-mode-pad ((,class :background ,bg-active :foreground ,fg-inactive)))
+ `(ruler-mode-tab-stop ((,class :inherit ruler-mode-default :foreground ,yellow-active)))
+;;;;; sallet
+ `(sallet-buffer-compressed ((,class :foreground ,yellow-nuanced :slant italic)))
+ `(sallet-buffer-default-directory ((,class :foreground ,cyan-nuanced)))
+ `(sallet-buffer-directory ((,class :foreground ,blue-nuanced)))
+ `(sallet-buffer-help ((,class :foreground ,fg-special-cold)))
+ `(sallet-buffer-modified ((,class :foreground ,yellow-alt-other :slant italic)))
+ `(sallet-buffer-ordinary ((,class :foreground ,fg-main)))
+ `(sallet-buffer-read-only ((,class :foreground ,yellow-alt)))
+ `(sallet-buffer-size ((,class :foreground ,fg-special-calm)))
+ `(sallet-buffer-special ((,class :foreground ,magenta-alt-other)))
+ `(sallet-flx-match ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-cyan
+ 'modus-theme-refine-cyan
+ 'modus-theme-nuanced-cyan
+ cyan-alt-other))))
+ `(sallet-recentf-buffer-name ((,class :foreground ,blue-nuanced)))
+ `(sallet-recentf-file-path ((,class :foreground ,fg-special-mild)))
+ `(sallet-regexp-match ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-magenta
+ 'modus-theme-refine-magenta
+ 'modus-theme-nuanced-magenta
+ magenta-alt-other))))
+ `(sallet-source-header ((,class :inherit bold :foreground ,red-alt
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4))))
+ `(sallet-substring-match ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-subtle-blue
+ 'modus-theme-refine-blue
+ 'modus-theme-nuanced-blue
+ blue-alt-other))))
+;;;;; selectrum
+ `(selectrum-current-candidate ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-refine-magenta
+ 'modus-theme-intense-magenta
+ 'modus-theme-nuanced-magenta
+ magenta
+ 'bold))))
+ `(selectrum-primary-highlight ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-refine-blue
+ 'modus-theme-intense-blue
+ 'modus-theme-nuanced-blue
+ blue
+ 'bold))))
+ `(selectrum-secondary-highlight ((,class ,@(modus-vivendi-theme-extra-completions
+ 'modus-theme-refine-cyan
+ 'modus-theme-intense-cyan
+ 'modus-theme-nuanced-cyan
+ cyan
+ 'bold))))
+;;;;; semantic
+ `(semantic-complete-inline-face ((,class :foreground ,fg-special-warm :underline t)))
+ `(semantic-decoration-on-private-members-face ((,class :inherit modus-theme-refine-cyan)))
+ `(semantic-decoration-on-protected-members-face ((,class :background ,bg-dim)))
+ `(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-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-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 ,@(modus-vivendi-theme-bold-weight) :foreground ,magenta-alt)))
+;;;;; show-paren-mode
+ `(show-paren-match ((,class ,@(modus-vivendi-theme-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)))
+;;;;; side-notes
+ `(side-notes ((,class :background ,bg-dim :foreground ,fg-dim)))
+;;;;; skewer-mode
+ `(skewer-error-face ((,class :foreground ,red :underline t)))
+;;;;; smart-mode-line
+ `(sml/charging ((,class :foreground ,green-active)))
+ `(sml/discharging ((,class :foreground ,red-active)))
+ `(sml/filename ((,class :inherit bold :foreground ,blue-active)))
+ `(sml/folder ((,class :foreground ,fg-active)))
+ `(sml/git ((,class :inherit bold :foreground ,green-active)))
+ `(sml/global ((,class :foreground ,fg-active)))
+ `(sml/line-number ((,class :inherit sml/global)))
+ `(sml/minor-modes ((,class :inherit sml/global)))
+ `(sml/modes ((,class :inherit bold :foreground ,fg-active)))
+ `(sml/modified ((,class :inherit bold :foreground ,magenta-active)))
+ `(sml/mule-info ((,class :inherit sml/global)))
+ `(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/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/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-show-pair-match-face ((,class ,@(modus-vivendi-theme-paren bg-paren-match
+ bg-paren-match-intense)
+ :foreground ,fg-main)))
+ `(sp-show-pair-mismatch-face ((,class :inherit modus-theme-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 ,@(modus-vivendi-theme-diffs
+ bg-main yellow
+ bg-diff-focus-changed fg-diff-focus-changed))))
+ `(smerge-lower ((,class ,@(modus-vivendi-theme-diffs
+ bg-main green
+ bg-diff-focus-added fg-diff-focus-added))))
+ `(smerge-markers ((,class :background ,bg-diff-neutral-2 :foreground ,fg-diff-neutral-2)))
+ `(smerge-refined-added ((,class ,@(modus-vivendi-theme-diffs
+ bg-diff-added fg-diff-added
+ bg-diff-refine-added fg-diff-refine-added))))
+ `(smerge-refined-changed ((,class)))
+ `(smerge-refined-removed ((,class ,@(modus-vivendi-theme-diffs
+ bg-diff-removed fg-diff-removed
+ bg-diff-refine-removed fg-diff-refine-removed))))
+ `(smerge-upper ((,class ,@(modus-vivendi-theme-diffs
+ bg-main red
+ bg-diff-focus-removed fg-diff-focus-removed))))
+;;;;; 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-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-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-python-venv ((,class :foreground ,magenta-active)))
+ `(spaceline-read-only ((,class :inherit modus-theme-fringe-red)))
+ `(spaceline-unmodified ((,class :inherit modus-theme-fringe-cyan)))
+;;;;; speedbar
+ `(speedbar-button-face ((,class :inherit link)))
+ `(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-selected-face ((,class :inherit bold :foreground ,cyan)))
+ `(speedbar-separator-face ((,class :inherit modus-theme-intense-neutral)))
+ `(speedbar-tag-face ((,class :foreground ,yellow-alt-other)))
+;;;;; spell-fu
+ `(spell-fu-incorrect-face
+ ((,(append '((supports :underline (:style wave))) class)
+ :foreground ,fg-lang-error :underline (:style wave))
+ (,class :foreground ,fg-lang-error :underline t)))
+;;;;; stripes
+ `(stripes ((,class :inherit modus-theme-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-subtle-cyan)))
+ `(swiper-background-match-face-3 ((,class :inherit modus-theme-subtle-magenta)))
+ `(swiper-background-match-face-4 ((,class :inherit modus-theme-subtle-green)))
+ `(swiper-line-face ((,class ,@(and (>= emacs-major-version 27) '(:extend t))
+ :inherit modus-theme-special-cold)))
+ `(swiper-match-face-1 ((,class :inherit swiper-line-face)))
+ `(swiper-match-face-2 ((,class :inherit swiper-line-face)))
+ `(swiper-match-face-3 ((,class :inherit swiper-line-face)))
+ `(swiper-match-face-4 ((,class :inherit swiper-line-face)))
+;;;;; swoop
+ `(swoop-face-header-format-line ((,class :inherit bold :foreground ,red-alt
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-3))))
+ `(swoop-face-line-buffer-name ((,class :inherit bold :foreground ,blue-alt
+ ,@(modus-vivendi-theme-scale modus-vivendi-theme-scale-4))))
+ `(swoop-face-line-number ((,class :foreground ,fg-special-warm)))
+ `(swoop-face-target-line ((,class :inherit modus-theme-intense-blue
+ ,@(and (>= emacs-major-version 27) '(:extend t)))))
+ `(swoop-face-target-words ((,class :inherit modus-theme-refine-cyan)))
+;;;;; sx
+ `(sx-inbox-item-type ((,class :foreground ,magenta-alt-other)))
+ `(sx-inbox-item-type-unread ((,class :inherit (sx-inbox-item-type bold))))
+ `(sx-question-list-answers ((,class :foreground ,green)))
+ `(sx-question-list-answers-accepted ((,class :box t :foreground ,green)))
+ `(sx-question-list-bounty ((,class :inherit bold :background ,bg-alt :foreground ,yellow)))
+ `(sx-question-list-date ((,class :foreground ,fg-special-cold)))
+ `(sx-question-list-favorite ((,class :inherit bold :foreground ,fg-special-warm)))
+ `(sx-question-list-parent ((,class :foreground ,fg-main)))
+ `(sx-question-list-read-question ((,class :foreground ,fg-alt)))
+ `(sx-question-list-score ((,class :foreground ,fg-special-mild)))
+ `(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-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)))
+ `(sx-question-mode-header ((,class :inherit bold :foreground ,cyan)))
+ `(sx-question-mode-kbd-tag ((,class :inherit bold :height 0.9 :box (:line-width 3 :color ,fg-main :style released-button) :foreground ,fg-main)))
+ `(sx-question-mode-score ((,class :foreground ,fg-dim)))
+ `(sx-question-mode-score-downvoted ((,class :foreground ,yellow)))
+ `(sx-question-mode-score-upvoted ((,class :inherit bold :foreground ,magenta)))
+ `(sx-question-mode-title ((,class :inherit bold :foreground ,fg-main)))
+ `(sx-question-mode-title-comments ((,class :inherit bold :foreground ,fg-alt)))
+ `(sx-tag ((,class :foreground ,magenta-alt)))
+ `(sx-user-name ((,class :foreground ,blue-alt)))
+ `(sx-user-reputation ((,class :foreground ,fg-alt)))
+;;;;; 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)))
+;;;;; syslog-mode
+ `(syslog-debug ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(syslog-error ((,class :inherit bold :foreground ,red)))
+ `(syslog-file ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(syslog-hide ((,class :background ,bg-main :foreground ,fg-main)))
+ `(syslog-hour ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(syslog-info ((,class :inherit bold :foreground ,blue-alt-other)))
+ `(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)))
+;;;;; table (built-in table.el)
+ `(table-cell ((,class :background ,blue-nuanced-bg)))
+;;;;; telephone-line
+ `(telephone-line-accent-active ((,class :background ,fg-inactive :foreground ,bg-inactive)))
+ `(telephone-line-accent-inactive ((,class :background ,bg-active :foreground ,fg-active)))
+ `(telephone-line-error ((,class :inherit bold :foreground ,red-active)))
+ `(telephone-line-evil ((,class :foreground ,fg-main)))
+ `(telephone-line-evil-emacs ((,class :inherit telephone-line-evil :background ,magenta-intense-bg)))
+ `(telephone-line-evil-insert ((,class :inherit telephone-line-evil :background ,green-intense-bg)))
+ `(telephone-line-evil-motion ((,class :inherit telephone-line-evil :background ,yellow-intense-bg)))
+ `(telephone-line-evil-normal ((,class :inherit telephone-line-evil :background ,bg-alt)))
+ `(telephone-line-evil-operator ((,class :inherit telephone-line-evil :background ,yellow-subtle-bg)))
+ `(telephone-line-evil-replace ((,class :inherit telephone-line-evil :background ,red-intense-bg)))
+ `(telephone-line-evil-visual ((,class :inherit telephone-line-evil :background ,cyan-intense-bg)))
+ `(telephone-line-projectile ((,class :foreground ,cyan-active)))
+ `(telephone-line-unimportant ((,class :foreground ,fg-inactive)))
+ `(telephone-line-warning ((,class :inherit bold :foreground ,yellow-active)))
+;;;;; term
+ `(term ((,class :background ,bg-main :foreground ,fg-main)))
+ `(term-bold ((,class :inherit bold)))
+ `(term-color-blue ((,class :background ,blue :foreground ,blue)))
+ `(term-color-cyan ((,class :background ,cyan :foreground ,cyan)))
+ `(term-color-green ((,class :background ,green :foreground ,green)))
+ `(term-color-magenta ((,class :background ,magenta :foreground ,magenta)))
+ `(term-color-red ((,class :background ,red :foreground ,red)))
+ `(term-color-yellow ((,class :background ,yellow :foreground ,yellow)))
+ `(term-underline ((,class :underline t)))
+;;;;; tomatinho
+ `(tomatinho-ok-face ((,class :foreground ,blue-intense)))
+ `(tomatinho-pause-face ((,class :foreground ,yellow-intense)))
+ `(tomatinho-reset-face ((,class :foreground ,fg-alt)))
+;;;;; transient
+ `(transient-active-infix ((,class :inherit modus-theme-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-heading ((,class :inherit bold :foreground ,fg-main)))
+ `(transient-inactive-argument ((,class :foreground ,fg-alt)))
+ `(transient-inactive-value ((,class :foreground ,fg-alt)))
+ `(transient-key ((,class :inherit bold :foreground ,blue)))
+ `(transient-mismatched-key ((,class :underline t)))
+ `(transient-nonstandard-key ((,class :underline t)))
+ `(transient-pink ((,class :inherit bold :foreground ,magenta)))
+ `(transient-red ((,class :inherit bold :foreground ,red-intense)))
+ `(transient-teal ((,class :inherit bold :foreground ,cyan-alt-other)))
+ `(transient-unreachable ((,class :foreground ,fg-unfocused)))
+ `(transient-unreachable-key ((,class :foreground ,fg-unfocused)))
+ `(transient-value ((,class :foreground ,magenta-alt)))
+;;;;; trashed
+ `(trashed-deleted ((,class :inherit modus-theme-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-symlink ((,class :foreground ,cyan-alt :underline t)))
+;;;;; treemacs
+ `(treemacs-directory-collapsed-face ((,class :foreground ,magenta-alt)))
+ `(treemacs-directory-face ((,class :inherit dired-directory)))
+ `(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-ignored-face ((,class :foreground ,fg-alt)))
+ `(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 ,@(modus-vivendi-theme-bold-weight) :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-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)))
+ `(treemacs-root-remote-unreadable-face ((,class :inherit treemacs-root-unreadable-face)))
+ `(treemacs-root-unreadable-face ((,class :inherit treemacs-root-face :strike-through t)))
+ `(treemacs-tags-face ((,class :foreground ,blue-alt)))
+ `(treemacs-tags-face ((,class :foreground ,magenta-alt)))
+;;;;; 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)))
+;;;;; 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)))
+ `(tuareg-font-double-semicolon-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ red-alt red-alt-faint))))
+ `(tuareg-font-lock-attribute-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(tuareg-font-lock-constructor-face ((,class :foreground ,fg-main)))
+ `(tuareg-font-lock-error-face ((,class :inherit (modus-theme-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 ,@(modus-vivendi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(tuareg-font-lock-interactive-directive-face ((,class :foreground ,fg-special-cold)))
+ `(tuareg-font-lock-interactive-error-face ((,class :inherit bold
+ ,@(modus-vivendi-theme-syntax-foreground
+ red red-faint))))
+ `(tuareg-font-lock-interactive-output-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(tuareg-font-lock-label-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint))))
+ `(tuareg-font-lock-line-number-face ((,class :foreground ,fg-special-warm)))
+ `(tuareg-font-lock-module-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint))))
+ `(tuareg-font-lock-multistage-face ((,class :inherit bold :background ,bg-alt
+ ,@(modus-vivendi-theme-syntax-foreground
+ blue blue-faint))))
+ `(tuareg-font-lock-operator-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ red-alt red-alt-faint))))
+ `(tuareg-opam-error-face ((,class :inherit bold
+ ,@(modus-vivendi-theme-syntax-foreground
+ red red-faint))))
+ `(tuareg-opam-pkg-variable-name-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan cyan-faint)
+ :slant ,modus-theme-slant)))
+;;;;; undo-tree
+ `(undo-tree-visualizer-active-branch-face ((,class :inherit bold :foreground ,fg-main)))
+ `(undo-tree-visualizer-current-face ((,class :foreground ,blue-intense)))
+ `(undo-tree-visualizer-default-face ((,class :foreground ,fg-alt)))
+ `(undo-tree-visualizer-register-face ((,class :foreground ,magenta-intense)))
+ `(undo-tree-visualizer-unmodified-face ((,class :foreground ,green-intense)))
+;;;;; vc
+ `(vc-conflict-state ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,red-active)))
+ `(vc-edited-state ((,class :foreground ,fg-special-warm)))
+ `(vc-locally-added-state ((,class :foreground ,cyan-active)))
+ `(vc-locked-state ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,magenta-active)))
+ `(vc-missing-state ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,yellow-active)))
+ `(vc-needs-update-state ((,class ,@(modus-vivendi-theme-bold-weight) :foreground ,fg-special-mild)))
+ `(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 ,@(modus-vivendi-theme-diffs
+ bg-main green
+ bg-diff-focus-added fg-diff-focus-added))))
+ `(vdiff-change-face ((,class ,@(modus-vivendi-theme-diffs
+ bg-main yellow
+ bg-diff-focus-changed fg-diff-focus-changed))))
+ `(vdiff-closed-fold-face ((,class :background ,bg-diff-neutral-1 :foreground ,fg-diff-neutral-1)))
+ `(vdiff-refine-added ((,class ,@(modus-vivendi-theme-diffs
+ bg-diff-added fg-diff-added
+ bg-diff-refine-added fg-diff-refine-added))))
+ `(vdiff-refine-changed ((,class ,@(modus-vivendi-theme-diffs
+ bg-diff-changed fg-diff-changed
+ bg-diff-refine-changed fg-diff-refine-changed))))
+ `(vdiff-subtraction-face ((,class ,@(modus-vivendi-theme-diffs
+ bg-main red
+ bg-diff-focus-removed fg-diff-focus-removed))))
+ `(vdiff-target-face ((,class :inherit modus-theme-intense-blue)))
+;;;;; vimish-fold
+ `(vimish-fold-fringe ((,class :foreground ,cyan-active)))
+ `(vimish-fold-mouse-face ((,class :inherit modus-theme-intense-blue)))
+ `(vimish-fold-overlay ((,class :background ,bg-alt :foreground ,fg-special-cold)))
+;;;;; visible-mark
+ `(visible-mark-active ((,class :background ,blue-intense-bg)))
+ `(visible-mark-face1 ((,class :background ,cyan-intense-bg)))
+ `(visible-mark-face2 ((,class :background ,yellow-intense-bg)))
+ `(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))))
+;;;;; volatile-highlights
+ `(vhl/default-face ((,class ,@(and (>= emacs-major-version 27) '(:extend t))
+ :background ,bg-alt :foreground ,blue-nuanced)))
+;;;;; vterm
+ `(vterm-color-black ((,class :background "black" :foreground "black")))
+ `(vterm-color-blue ((,class :background ,blue :foreground ,blue)))
+ `(vterm-color-cyan ((,class :background ,cyan :foreground ,cyan)))
+ `(vterm-color-default ((,class :background ,bg-main :foreground ,fg-main)))
+ `(vterm-color-green ((,class :background ,green :foreground ,green)))
+ `(vterm-color-inverse-video ((,class :background ,bg-main :inverse-video t)))
+ `(vterm-color-magenta ((,class :background ,magenta :foreground ,magenta)))
+ `(vterm-color-red ((,class :background ,red :foreground ,red)))
+ `(vterm-color-underline ((,class :foreground ,fg-special-warm :underline t)))
+ `(vterm-color-white ((,class :background "white" :foreground "white")))
+ `(vterm-color-yellow ((,class :background ,yellow :foreground ,yellow)))
+;;;;; wcheck-mode
+ `(wcheck-default-face ((,class :foreground ,red :underline t)))
+;;;;; web-mode
+ `(web-mode-annotation-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-annotation-html-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-annotation-tag-face ((,class :inherit web-mode-comment-face :underline t)))
+ `(web-mode-block-attr-name-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue blue-faint))))
+ `(web-mode-block-attr-value-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint))))
+ `(web-mode-block-comment-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-block-control-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(web-mode-block-delimiter-face ((,class :foreground ,fg-main)))
+ `(web-mode-block-face ((,class :background ,bg-dim)))
+ `(web-mode-block-string-face ((,class :inherit web-mode-string-face)))
+ `(web-mode-bold-face ((,class :inherit bold)))
+ `(web-mode-builtin-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(web-mode-comment-face ((,class :foreground ,fg-alt :slant ,modus-theme-slant)))
+ `(web-mode-comment-keyword-face ((,class :inherit bold :background ,bg-dim
+ ,@(modus-vivendi-theme-syntax-foreground
+ yellow yellow-faint))))
+ `(web-mode-constant-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(web-mode-css-at-rule-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(web-mode-css-color-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(web-mode-css-comment-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-css-function-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(web-mode-css-priority-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ yellow-alt yellow-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(web-mode-css-property-name-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(web-mode-css-pseudo-class-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint))))
+ `(web-mode-css-selector-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(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 :foreground ,fg-special-cold :slant ,modus-theme-slant)))
+ `(web-mode-error-face ((,class :inherit modus-theme-intense-red)))
+ `(web-mode-filter-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-folded-face ((,class :underline t)))
+ `(web-mode-function-call-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-function-name-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-html-attr-custom-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(web-mode-html-attr-engine-face ((,class :foreground ,fg-main)))
+ `(web-mode-html-attr-equal-face ((,class :foreground ,fg-main)))
+ `(web-mode-html-attr-name-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(web-mode-html-attr-value-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(web-mode-html-entity-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ yellow-alt-other yellow-alt-other-faint)
+ :slant ,modus-theme-slant)))
+ `(web-mode-html-tag-bracket-face ((,class :foreground ,fg-dim)))
+ `(web-mode-html-tag-custom-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-html-tag-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-html-tag-namespaced-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(web-mode-html-tag-unclosed-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ red red-faint)
+ :underline t)))
+ `(web-mode-inlay-face ((,class :background ,bg-alt)))
+ `(web-mode-italic-face ((,class :slant italic)))
+ `(web-mode-javascript-comment-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-javascript-string-face ((,class :inherit web-mode-string-face)))
+ `(web-mode-json-comment-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-json-context-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint))))
+ `(web-mode-json-key-face ((,class :foreground ,blue-nuanced)))
+ `(web-mode-json-string-face ((,class :inherit web-mode-string-face)))
+ `(web-mode-jsx-depth-1-face ((,class :background ,blue-intense-bg :foreground ,fg-main)))
+ `(web-mode-jsx-depth-2-face ((,class :background ,blue-subtle-bg :foreground ,fg-main)))
+ `(web-mode-jsx-depth-3-face ((,class :background ,bg-special-cold :foreground ,fg-special-cold)))
+ `(web-mode-jsx-depth-4-face ((,class :background ,bg-alt :foreground ,blue-refine-fg)))
+ `(web-mode-jsx-depth-5-face ((,class :background ,bg-alt :foreground ,blue-nuanced)))
+ `(web-mode-keyword-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt-other magenta-alt-other-faint)
+ ,@(modus-vivendi-theme-bold-weight))))
+ `(web-mode-param-name-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta magenta-faint))))
+ `(web-mode-part-comment-face ((,class :inherit web-mode-comment-face)))
+ `(web-mode-part-face ((,class :inherit web-mode-block-face)))
+ `(web-mode-part-string-face ((,class :inherit web-mode-string-face)))
+ `(web-mode-preprocessor-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ red-alt-other red-alt-other-faint))))
+ `(web-mode-script-face ((,class :inherit web-mode-part-face)))
+ `(web-mode-sql-keyword-face ((,class :inherit bold
+ ,@(modus-vivendi-theme-syntax-foreground
+ yellow yellow-faint))))
+ `(web-mode-string-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue-alt blue-alt-faint))))
+ `(web-mode-style-face ((,class :inherit web-mode-part-face)))
+ `(web-mode-symbol-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ blue-alt-other blue-alt-other-faint))))
+ `(web-mode-type-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ magenta-alt magenta-alt-faint))))
+ `(web-mode-underline-face ((,class :underline t)))
+ `(web-mode-variable-name-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan cyan-faint))))
+ `(web-mode-warning-face ((,class :inherit bold :background ,bg-alt
+ ,@(modus-vivendi-theme-syntax-foreground
+ yellow-alt-other yellow-alt-other-faint))))
+ `(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-file-face ((,class :foreground ,fg-special-warm)))
+ `(wgrep-reject-face ((,class :inherit (modus-theme-intense-red bold))))
+;;;;; which-function-mode
+ `(which-func ((,class :foreground ,magenta-active)))
+;;;;; which-key
+ `(which-key-command-description-face ((,class :foreground ,cyan)))
+ `(which-key-group-description-face ((,class :foreground ,magenta-alt)))
+ `(which-key-highlighted-command-face ((,class :foreground ,cyan-alt :underline t)))
+ `(which-key-key-face ((,class :inherit bold :foreground ,blue-intense)))
+ `(which-key-local-map-description-face ((,class :foreground ,fg-main)))
+ `(which-key-note-face ((,class :background ,bg-dim :foreground ,fg-special-mild)))
+ `(which-key-separator-face ((,class :foreground ,fg-alt)))
+ `(which-key-special-key-face ((,class :inherit bold :foreground ,yellow-intense)))
+;;;;; whitespace-mode
+ `(whitespace-big-indent ((,class :inherit modus-theme-subtle-red)))
+ `(whitespace-empty ((,class :inherit modus-theme-intense-magenta)))
+ `(whitespace-hspace ((,class :background ,bg-whitespace :foreground ,fg-whitespace)))
+ `(whitespace-indentation ((,class :background ,bg-whitespace :foreground ,fg-whitespace)))
+ `(whitespace-line ((,class :inherit modus-theme-special-warm)))
+ `(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-tab ((,class :background ,bg-whitespace :foreground ,fg-whitespace)))
+ `(whitespace-trailing ((,class :inherit modus-theme-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 ,@(modus-vivendi-theme-bold-weight) :foreground ,cyan-active)))
+;;;;; writegood-mode
+ `(writegood-duplicates-face ((,class :background ,bg-alt :foreground ,red-alt :underline t)))
+ `(writegood-passive-voice-face ((,class :foreground ,yellow-nuanced :underline ,fg-lang-warning)))
+ `(writegood-weasels-face ((,class :foreground ,red-nuanced :underline ,fg-lang-error)))
+;;;;; woman
+ `(woman-addition ((,class :foreground ,magenta-alt-other)))
+ `(woman-bold ((,class :inherit bold :foreground ,magenta)))
+ `(woman-italic ((,class :foreground ,cyan :slant italic)))
+ `(woman-unknown ((,class :foreground ,yellow :slant italic)))
+;;;;; xah-elisp-mode
+ `(xah-elisp-at-symbol ((,class :inherit bold
+ ,@(modus-vivendi-theme-syntax-foreground
+ red-alt red-alt-faint))))
+ `(xah-elisp-cap-variable ((,class ,@(modus-vivendi-theme-syntax-foreground
+ red-alt-other red-alt-other-faint))))
+ `(xah-elisp-command-face ((,class ,@(modus-vivendi-theme-syntax-foreground
+ cyan-alt-other cyan-alt-other-faint))))
+ `(xah-elisp-dollar-symbol ((,class ,@(modus-vivendi-theme-syntax-foreground
+ green green-faint))))
+;;;;; xref
+ `(xref-file-header ((,class :inherit bold :foreground ,fg-special-cold)))
+ `(xref-line-number ((,class :foreground ,fg-alt)))
+ `(xref-match ((,class :inherit match)))
+;;;;; yaml-mode
+ `(yaml-tab-face ((,class :inherit modus-theme-intense-red)))
+;;;;; yasnippet
+ `(yas-field-highlight-face ((,class :background ,bg-alt :foreground ,fg-main)))
+;;;;; 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-model-diff-face ((,class :foreground ,red)))
+ `(ztreep-diff-model-ignored-face ((,class :foreground ,fg-alt :strike-through t)))
+ `(ztreep-diff-model-normal-face ((,class :foreground ,fg-alt)))
+ `(ztreep-expand-sign-face ((,class :foreground ,blue)))
+ `(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)))
+ `(ztreep-node-face ((,class :foreground ,fg-main))))
+;;;; Emacs 27+
+ ;; EXPERIMENTAL this form is subject to review
+ (when (>= emacs-major-version 27)
+ (custom-theme-set-faces
+ 'modus-vivendi
+;;;;; line numbers (`display-line-numbers-mode' and global variant)
+ ;; NOTE that this is specifically for the faces that were
+ ;; introduced in Emacs 27, as the other faces are already
+ ;; supported.
+ `(line-number-major-tick ((,class (:background ,yellow-nuanced-bg :foreground ,yellow-nuanced))))
+ `(line-number-minor-tick ((,class (:background ,cyan-nuanced-bg :foreground ,cyan-nuanced))))
+;;;;; tab-bar-mode
+ `(tab-bar ((,class :background ,bg-tab-bar :foreground ,fg-main)))
+ `(tab-bar-tab ((,class :inherit bold :box (:line-width 2 :color ,bg-tab-active)
+ :background ,bg-tab-active :foreground ,fg-main)))
+ `(tab-bar-tab-inactive ((,class :box (:line-width 2 :color ,bg-tab-inactive)
+ :background ,bg-tab-inactive :foreground ,fg-dim)))
+;;;;; tab-line-mode
+ `(tab-line ((,class :height 0.95 :background ,bg-tab-bar :foreground ,fg-main)))
+ `(tab-line-close-highlight ((,class :foreground ,red)))
+ `(tab-line-highlight ((,class :background ,blue-subtle-bg :foreground ,fg-dim)))
+ `(tab-line-tab ((,class :inherit bold :box (:line-width 2 :color ,bg-tab-active)
+ :background ,bg-tab-active :foreground ,fg-main)))
+ `(tab-line-tab-current ((,class :inherit tab-line-tab)))
+ `(tab-line-tab-inactive ((,class :box (:line-width 2 :color ,bg-tab-inactive)
+ :background ,bg-tab-inactive :foreground ,fg-dim)))))
+;;; variables
+ (custom-theme-set-variables
+ 'modus-vivendi
+;;;; ansi-colors
+ `(ansi-color-faces-vector [default bold shadow italic underline success warning error])
+ `(ansi-color-names-vector [,bg-main ,red ,green ,yellow ,blue ,magenta ,cyan ,fg-main])
+;;;; 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))
+;;;; 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-header)
+;;;; highlight-tail
+ `(highlight-tail-colors
+ '((,green-subtle-bg . 0)
+ (,cyan-subtle-bg . 20)))
+;;;; hl-todo
+ `(hl-todo-keyword-faces
+ '(("HOLD" . ,yellow-alt)
+ ("TODO" . ,magenta)
+ ("NEXT" . ,magenta-alt-other)
+ ("THEM" . ,magenta-alt)
+ ("PROG" . ,cyan)
+ ("OKAY" . ,cyan-alt)
+ ("DONT" . ,green-alt)
+ ("FAIL" . ,red)
+ ("BUG" . ,red)
+ ("DONE" . ,green)
+ ("NOTE" . ,yellow-alt-other)
+ ("KLUDGE" . ,yellow)
+ ("HACK" . ,yellow)
+ ("TEMP" . ,red-nuanced)
+ ("FIXME" . ,red-alt-other)
+ ("XXX+" . ,red-alt)
+ ("REVIEW" . ,cyan-alt-other)
+ ("DEPRECATED" . ,blue-nuanced)))
+;;;; vc-annotate (C-x v g)
+ `(vc-annotate-background nil)
+ `(vc-annotate-background-mode nil)
+ `(vc-annotate-color-map
+ '((20 . ,red)
+ (40 . ,magenta)
+ (60 . ,magenta-alt)
+ (80 . ,red-alt)
+ (100 . ,yellow)
+ (120 . ,yellow-alt)
+ (140 . ,fg-special-warm)
+ (160 . ,fg-special-mild)
+ (180 . ,green)
+ (200 . ,green-alt)
+ (220 . ,cyan-alt-other)
+ (240 . ,cyan-alt)
+ (260 . ,cyan)
+ (280 . ,fg-special-cold)
+ (300 . ,blue)
+ (320 . ,blue-alt)
+ (340 . ,blue-alt-other)
+ (360 . ,magenta-alt-other)))
+ `(vc-annotate-very-old-color nil)
+;;;; xterm-color
+ `(xterm-color-names [,bg-main ,red ,green ,yellow ,blue ,magenta ,cyan ,fg-alt])
+ `(xterm-color-names-bright [,bg-alt ,red-alt ,green-alt ,yellow-alt ,blue-alt ,magenta-alt ,cyan-alt ,fg-main]))
+;;; Conditional theme variables
+;;;; org-src-block-faces
+ ;; this is a user option to add a colour-coded background to source
+ ;; blocks for various programming languages
+ (when (eq modus-vivendi-theme-org-blocks 'rainbow)
+ (custom-theme-set-variables
+ 'modus-vivendi
+ `(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)
+ ("json" modus-theme-nuanced-cyan))))))
+
+;;; library provides
+;;;###autoload
+(when load-file-name
+ (add-to-list 'custom-theme-load-path
+ (file-name-as-directory (file-name-directory load-file-name))))
+
+(provide-theme 'modus-vivendi)
+
+(provide 'modus-vivendi-theme)
+
+;;; modus-vivendi-theme.el ends here
diff --git a/etc/w32-feature.el b/etc/w32-feature.el
new file mode 100644
index 00000000000..3c0f74175cf
--- /dev/null
+++ b/etc/w32-feature.el
@@ -0,0 +1,87 @@
+;;; w32-feature.el --- Check Availability of Emacs Features -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Free Software Foundation, Inc.
+
+;; Author: Phillip Lord <phillip.lord@russet.org.uk>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This file provides tests for various features of Emacs. It is
+;; designed to check whether bundled binary distributions of Emacs on
+;; windows are fully functional.
+
+;;; Code:
+(require 'ert)
+
+(ert-deftest feature-optimization ()
+ (should
+ (string-match-p "CFLAGS=-O2" system-configuration-options)))
+
+(ert-deftest feature-harfbuzz ()
+ (should
+ (eq
+ 'harfbuzz
+ (car (frame-parameter nil 'font-backend)))))
+
+(ert-deftest feature-gnutls ()
+ (should (gnutls-available-p)))
+
+(ert-deftest feature-zlib ()
+ (should (zlib-available-p)))
+
+(ert-deftest feature-thread ()
+ (should (fboundp 'make-thread)))
+
+(ert-deftest feature-json ()
+ (should
+ (fboundp 'json-serialize)))
+
+(ert-deftest feature-gmp ()
+ (should
+ (string-match-p "GMP" system-configuration-features)))
+
+(ert-deftest feature-module ()
+ (should (fboundp 'module-load)))
+
+(ert-deftest feature-libxml ()
+ (should (libxml-available-p)))
+
+(ert-deftest feature-lcms2 ()
+ (should (lcms2-available-p)))
+
+(ert-deftest feature-xpm ()
+ (should (image-type-available-p 'xpm)))
+
+(ert-deftest feature-gif ()
+ (should (image-type-available-p 'gif)))
+
+(ert-deftest feature-png ()
+ (should (image-type-available-p 'png)))
+
+(ert-deftest feature-xpm ()
+ (should (image-type-available-p 'xpm)))
+
+(ert-deftest feature-jpeg ()
+ (should (image-type-available-p 'jpeg)))
+
+(ert-deftest feature-tiff ()
+ (should (image-type-available-p 'tiff)))
+
+(ert-deftest feature-svg ()
+ (should (image-type-available-p 'svg)))
+;;; feature.el ends here
diff --git a/leim/SKK-DIC/SKK-JISYO.L b/leim/SKK-DIC/SKK-JISYO.L
index 6b024e3dc4b..9098868caea 100644
--- a/leim/SKK-DIC/SKK-JISYO.L
+++ b/leim/SKK-DIC/SKK-JISYO.L
@@ -22978,6 +22978,7 @@ covering /¥«¥Ð¡¼¥ê¥ó¥°/
coverstory /¥«¥Ð¡¼¥¹¥È¡¼¥ê¡¼/
coverup /¥«¥Ð¡¼¥¢¥Ã¥×/
coverversion /¥«¥Ð¡¼¥Ð¡¼¥¸¥ç¥ó/
+covid-19 /¿··¿¥³¥í¥Ê¥¦¥¤¥ë¥¹´¶À÷¾É;Coronavirus disease 2019/
cow /¥«¥¦/
cowbell /¥«¥¦¥Ù¥ë/
cowboy /¥«¥¦¥Ü¡¼¥¤/
@@ -38107,6 +38108,9 @@ sardine /¥µ¡¼¥Ç¥£¥ó/
sari /¥µ¥ê¡¼/¥µ¥ê/
sarin /¥µ¥ê¥ó/
sarod /¥µ¥í¡¼¥É/¥µ¥í¥Ã¥É/
+sars /severe acute respiratory syndrome/½Å¾ÉµÞÀ­¸ÆµÛ´ï¾É¸õ·²/
+sars-cov /severe acute respiratory syndrome coronavirus/SARS¥³¥í¥Ê¥¦¥¤¥ë¥¹
+sars-cov-2 /severe acute respiratory syndrome coronavirus 2/2019¿··¿¥³¥í¥Ê¥¦¥¤¥ë¥¹
sartre /¥µ¥ë¥È¥ë/
saruman /¥µ¥ë¥Þ¥ó/
sasa /¥µ¥µ/
diff --git a/lib/cdefs.h b/lib/cdefs.h
index b1870fd0a93..ff7c628a264 100644
--- a/lib/cdefs.h
+++ b/lib/cdefs.h
@@ -148,7 +148,11 @@
# define __warnattr(msg) __attribute__((__warning__ (msg)))
# define __errordecl(name, msg) \
extern void name (void) __attribute__((__error__ (msg)))
-#elif __glibc_clang_has_attribute (__diagnose_if__) && 0 /* fails on Fedora 31 with Clang 9. */
+#elif __glibc_clang_has_attribute (__diagnose_if__) && 0
+/* These definitions are not enabled, because they produce bogus warnings
+ in the glibc Fortify functions. These functions are written in a style
+ that works with GCC. In order to work with clang, these functions would
+ need to be modified. */
# define __warndecl(name, msg) \
extern void name (void) __attribute__((__diagnose_if__ (1, msg, "warning")))
# define __warnattr(msg) __attribute__((__diagnose_if__ (1, msg, "warning")))
diff --git a/lib/diffseq.h b/lib/diffseq.h
index c89363ac9ee..26e10bdd043 100644
--- a/lib/diffseq.h
+++ b/lib/diffseq.h
@@ -51,10 +51,14 @@
EXTRA_CONTEXT_FIELDS Declarations of fields for 'struct context'.
NOTE_DELETE(ctxt, xoff) Record the removal of the object xvec[xoff].
NOTE_INSERT(ctxt, yoff) Record the insertion of the object yvec[yoff].
+ NOTE_ORDERED (Optional) A boolean expression saying that
+ NOTE_DELETE and NOTE_INSERT calls must be
+ issued in offset order.
EARLY_ABORT(ctxt) (Optional) A boolean expression that triggers an
early abort of the computation.
USE_HEURISTIC (Optional) Define if you want to support the
heuristic for large vectors.
+
It is also possible to use this file with abstract arrays. In this case,
xvec and yvec are not represented in memory. They only exist conceptually.
In this case, the list of defines above is amended as follows:
@@ -63,6 +67,7 @@
XVECREF_YVECREF_EQUAL(ctxt, xoff, yoff)
A three-argument macro: References xvec[xoff] and
yvec[yoff] and tests these elements for equality.
+
Before including this file, you also need to include:
#include <limits.h>
#include <stdbool.h>
@@ -78,6 +83,10 @@
# define EARLY_ABORT(ctxt) false
#endif
+#ifndef NOTE_ORDERED
+# define NOTE_ORDERED false
+#endif
+
/* Use this to suppress gcc's "...may be used before initialized" warnings.
Beware: The Code argument must not contain commas. */
#ifndef IF_LINT
@@ -88,15 +97,6 @@
# endif
#endif
-/* As above, but when Code must contain one comma. */
-#ifndef IF_LINT2
-# if defined GCC_LINT || defined lint
-# define IF_LINT2(Code1, Code2) Code1, Code2
-# else
-# define IF_LINT2(Code1, Code2) /* empty */
-# endif
-#endif
-
/*
* Context of comparison operation.
*/
@@ -468,49 +468,89 @@ compareseq (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim,
#define XREF_YREF_EQUAL(x,y) XVECREF_YVECREF_EQUAL (ctxt, x, y)
#endif
- /* Slide down the bottom initial diagonal. */
- while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xoff, yoff))
+ while (true)
{
- xoff++;
- yoff++;
- }
+ /* Slide down the bottom initial diagonal. */
+ while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xoff, yoff))
+ {
+ xoff++;
+ yoff++;
+ }
- /* Slide up the top initial diagonal. */
- while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xlim - 1, ylim - 1))
- {
- xlim--;
- ylim--;
- }
+ /* Slide up the top initial diagonal. */
+ while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xlim - 1, ylim - 1))
+ {
+ xlim--;
+ ylim--;
+ }
- /* Handle simple cases. */
- if (xoff == xlim)
- while (yoff < ylim)
- {
- NOTE_INSERT (ctxt, yoff);
- if (EARLY_ABORT (ctxt))
- return true;
- yoff++;
- }
- else if (yoff == ylim)
- while (xoff < xlim)
- {
- NOTE_DELETE (ctxt, xoff);
- if (EARLY_ABORT (ctxt))
- return true;
- xoff++;
- }
- else
- {
- struct partition part IF_LINT2 (= { .xmid = 0, .ymid = 0 });
+ /* Handle simple cases. */
+ if (xoff == xlim)
+ {
+ while (yoff < ylim)
+ {
+ NOTE_INSERT (ctxt, yoff);
+ if (EARLY_ABORT (ctxt))
+ return true;
+ yoff++;
+ }
+ break;
+ }
+ if (yoff == ylim)
+ {
+ while (xoff < xlim)
+ {
+ NOTE_DELETE (ctxt, xoff);
+ if (EARLY_ABORT (ctxt))
+ return true;
+ xoff++;
+ }
+ break;
+ }
+
+ struct partition part;
/* Find a point of correspondence in the middle of the vectors. */
diag (xoff, xlim, yoff, ylim, find_minimal, &part, ctxt);
/* Use the partitions to split this problem into subproblems. */
- if (compareseq (xoff, part.xmid, yoff, part.ymid, part.lo_minimal, ctxt))
- return true;
- if (compareseq (part.xmid, xlim, part.ymid, ylim, part.hi_minimal, ctxt))
- return true;
+ OFFSET xoff1, xlim1, yoff1, ylim1, xoff2, xlim2, yoff2, ylim2;
+ bool find_minimal1, find_minimal2;
+ if (!NOTE_ORDERED
+ && ((xlim + ylim) - (part.xmid + part.ymid)
+ < (part.xmid + part.ymid) - (xoff + yoff)))
+ {
+ /* The second problem is smaller and the caller doesn't
+ care about order, so do the second problem first to
+ lessen recursion. */
+ xoff1 = part.xmid; xlim1 = xlim;
+ yoff1 = part.ymid; ylim1 = ylim;
+ find_minimal1 = part.hi_minimal;
+
+ xoff2 = xoff; xlim2 = part.xmid;
+ yoff2 = yoff; ylim2 = part.ymid;
+ find_minimal2 = part.lo_minimal;
+ }
+ else
+ {
+ xoff1 = xoff; xlim1 = part.xmid;
+ yoff1 = yoff; ylim1 = part.ymid;
+ find_minimal1 = part.lo_minimal;
+
+ xoff2 = part.xmid; xlim2 = xlim;
+ yoff2 = part.ymid; ylim2 = ylim;
+ find_minimal2 = part.hi_minimal;
+ }
+
+ /* Recurse to do one subproblem. */
+ bool early = compareseq (xoff1, xlim1, yoff1, ylim1, find_minimal1, ctxt);
+ if (early)
+ return early;
+
+ /* Iterate to do the other subproblem. */
+ xoff = xoff2; xlim = xlim2;
+ yoff = yoff2; ylim = ylim2;
+ find_minimal = find_minimal2;
}
return false;
diff --git a/lib/gnulib.mk.in b/lib/gnulib.mk.in
index 78b4542d80a..f564d501222 100644
--- a/lib/gnulib.mk.in
+++ b/lib/gnulib.mk.in
@@ -136,6 +136,7 @@
# readlinkat \
# regex \
# sig2str \
+# sigdescr_np \
# socklen \
# stat-time \
# std-gnu11 \
@@ -426,6 +427,7 @@ GNULIB_SETENV = @GNULIB_SETENV@
GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
GNULIB_SIGABBREV_NP = @GNULIB_SIGABBREV_NP@
GNULIB_SIGACTION = @GNULIB_SIGACTION@
+GNULIB_SIGDESCR_NP = @GNULIB_SIGDESCR_NP@
GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@
GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@
GNULIB_SLEEP = @GNULIB_SLEEP@
@@ -647,6 +649,7 @@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
HAVE_SETSTATE = @HAVE_SETSTATE@
HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@
HAVE_SIGACTION = @HAVE_SIGACTION@
+HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@
HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@
HAVE_SIGINFO_T = @HAVE_SIGINFO_T@
HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
@@ -2312,6 +2315,17 @@ EXTRA_libgnu_a_SOURCES += sig2str.c
endif
## end gnulib module sig2str
+## begin gnulib module sigdescr_np
+ifeq (,$(OMIT_GNULIB_MODULE_sigdescr_np))
+
+
+EXTRA_DIST += sigdescr_np.c
+
+EXTRA_libgnu_a_SOURCES += sigdescr_np.c
+
+endif
+## end gnulib module sigdescr_np
+
## begin gnulib module signal-h
ifeq (,$(OMIT_GNULIB_MODULE_signal-h))
@@ -2846,6 +2860,7 @@ string.h: string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H
-e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \
-e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \
-e 's/@''GNULIB_SIGABBREV_NP''@/$(GNULIB_SIGABBREV_NP)/g' \
+ -e 's/@''GNULIB_SIGDESCR_NP''@/$(GNULIB_SIGDESCR_NP)/g' \
-e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \
-e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \
< $(srcdir)/string.in.h | \
@@ -2869,6 +2884,7 @@ string.h: string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H
-e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \
-e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \
-e 's|@''HAVE_SIGABBREV_NP''@|$(HAVE_SIGABBREV_NP)|g' \
+ -e 's|@''HAVE_SIGDESCR_NP''@|$(HAVE_SIGDESCR_NP)|g' \
-e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \
-e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \
-e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \
diff --git a/lib/intprops.h b/lib/intprops.h
index f2f70b3e733..b27f2eea056 100644
--- a/lib/intprops.h
+++ b/lib/intprops.h
@@ -48,7 +48,7 @@
/* Minimum and maximum values for integer types and expressions. */
/* The width in bits of the integer type or expression T.
- Do not evaluate T.
+ Do not evaluate T. T must not be a bit-field expression.
Padding bits are not supported; this is checked at compile-time below. */
#define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)
@@ -70,7 +70,7 @@
? _GL_SIGNED_INT_MAXIMUM (e) \
: _GL_INT_NEGATE_CONVERT (e, 1))
#define _GL_SIGNED_INT_MAXIMUM(e) \
- (((_GL_INT_CONVERT (e, 1) << (TYPE_WIDTH ((e) + 0) - 2)) - 1) * 2 + 1)
+ (((_GL_INT_CONVERT (e, 1) << (TYPE_WIDTH (+ (e)) - 2)) - 1) * 2 + 1)
/* Work around OpenVMS incompatibility with C99. */
#if !defined LLONG_MAX && defined __INT64_MAX
@@ -95,8 +95,9 @@
#endif
/* Return 1 if the integer type or expression T might be signed. Return 0
- if it is definitely unsigned. This macro does not evaluate its argument,
- and expands to an integer constant expression. */
+ if it is definitely unsigned. T must not be a bit-field expression.
+ This macro does not evaluate its argument, and expands to an
+ integer constant expression. */
#if _GL_HAVE___TYPEOF__
# define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t))
#else
@@ -109,6 +110,8 @@
#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
/* Bound on length of the string representing an integer type or expression T.
+ T must not be a bit-field expression.
+
Subtract 1 for the sign bit if T is signed, and then add 1 more for
a minus sign if needed.
@@ -120,7 +123,7 @@
+ _GL_SIGNED_TYPE_OR_EXPR (t))
/* Bound on buffer size needed to represent an integer type or expression T,
- including the terminating null. */
+ including the terminating null. T must not be a bit-field expression. */
#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
@@ -566,7 +569,7 @@
? (EXPR_SIGNED (_GL_INT_CONVERT (tmax, b)) \
? (a) < (tmax) / (b) \
: ((INT_NEGATE_OVERFLOW (b) \
- ? _GL_INT_CONVERT (b, tmax) >> (TYPE_WIDTH (b) - 1) \
+ ? _GL_INT_CONVERT (b, tmax) >> (TYPE_WIDTH (+ (b)) - 1) \
: (tmax) / -(b)) \
<= -1 - (a))) \
: INT_NEGATE_OVERFLOW (_GL_INT_CONVERT (b, tmin)) && (b) == -1 \
diff --git a/lib/sig2str.c b/lib/sig2str.c
index 905daea2f20..cf7c3bb5c38 100644
--- a/lib/sig2str.c
+++ b/lib/sig2str.c
@@ -189,6 +189,11 @@ static struct numname { int num; char const name[8]; } numname_table[] =
NUMNAME (STKFLT),
#endif
+ /* AIX 7. */
+#ifdef SIGCPUFAIL
+ NUMNAME (CPUFAIL),
+#endif
+
/* AIX 5L. */
#ifdef SIGDANGER
NUMNAME (DANGER),
@@ -229,7 +234,12 @@ static struct numname { int num; char const name[8]; } numname_table[] =
NUMNAME (WINDOW), /* Older name for SIGWINCH. */
#endif
- /* BeOS */
+ /* OpenBSD. */
+#ifdef SIGTHR
+ NUMNAME (THR),
+#endif
+
+ /* BeOS, Haiku */
#ifdef SIGKILLTHR
NUMNAME (KILLTHR),
#endif
@@ -239,6 +249,11 @@ static struct numname { int num; char const name[8]; } numname_table[] =
NUMNAME (DIL),
#endif
+ /* native Windows */
+#ifdef SIGBREAK
+ NUMNAME (BREAK),
+#endif
+
/* Korn shell and Bash, of uncertain vintage. */
{ 0, "EXIT" }
};
diff --git a/lib/sigdescr_np.c b/lib/sigdescr_np.c
new file mode 100644
index 00000000000..fc9cd3c2369
--- /dev/null
+++ b/lib/sigdescr_np.c
@@ -0,0 +1,376 @@
+/* English descriptions of signals.
+ Copyright (C) 2020 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2020. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <signal.h>
+
+const char *
+sigdescr_np (int sig)
+{
+ /* Note: Some platforms (glibc, FreeBSD, NetBSD, OpenBSD, AIX, IRIX, Haiku,
+ Android) have an array 'sys_siglist'. (On AIX, you need to declare it
+ yourself, and it has fewer than NSIG elements.) Its contents varies
+ depending on the OS.
+ On other OSes, you can invoke strsignal (sig) in the C locale.
+ In the code below, we show the differences.
+ You can see how cryptic some of these strings are. We try to pick more
+ understandable wordings. */
+
+ switch (sig)
+ {
+ /* Signals specified by ISO C. */
+ case SIGABRT:
+ /* glibc: "Aborted". *BSD: "Abort trap". Solaris: "Abort". */
+ return "Aborted";
+ case SIGFPE:
+ /* glibc, *BSD: "Floating point exception". Solaris: "Arithmetic exception".
+ The latter is more correct, because of integer division by 0 or -1. */
+ return "Arithmetic exception";
+ case SIGILL:
+ return "Illegal instruction";
+ case SIGINT:
+ return "Interrupt";
+ case SIGSEGV:
+ return "Segmentation fault";
+ case SIGTERM:
+ return "Terminated";
+
+ /* Signals specified by POSIX.
+ <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html> */
+ #if defined SIGALRM
+ case SIGALRM:
+ return "Alarm clock";
+ #endif
+ #if defined SIGBUS
+ case SIGBUS:
+ return "Bus error";
+ #endif
+ #if defined SIGCHLD
+ case SIGCHLD:
+ /* glibc, *BSD: "Child exited". Solaris: "Child status changed". */
+ return "Child stopped or exited";
+ #endif
+ #if defined SIGCONT
+ case SIGCONT:
+ return "Continued";
+ #endif
+ #if defined SIGHUP
+ case SIGHUP:
+ return "Hangup";
+ #endif
+ #if defined SIGKILL
+ case SIGKILL:
+ return "Killed";
+ #endif
+ #if defined SIGPIPE
+ case SIGPIPE:
+ return "Broken pipe";
+ #endif
+ #if defined SIGQUIT
+ case SIGQUIT:
+ return "Quit";
+ #endif
+ #if defined SIGSTOP
+ case SIGSTOP:
+ /* glibc, Solaris: "Stopped (signal)". *BSD: "Suspended (signal)". */
+ return "Stopped (signal)";
+ #endif
+ #if defined SIGTSTP
+ case SIGTSTP:
+ /* glibc: "Stopped". *BSD: "Suspended". Solaris: "Stopped (user)". */
+ return "Stopped";
+ #endif
+ #if defined SIGTTIN
+ case SIGTTIN:
+ return "Stopped (tty input)";
+ #endif
+ #if defined SIGTTOU
+ case SIGTTOU:
+ return "Stopped (tty output)";
+ #endif
+ #if defined SIGUSR1
+ case SIGUSR1:
+ /* glibc, *BSD: "User defined signal 1". Solaris: "User signal 1". */
+ return "User defined signal 1";
+ #endif
+ #if defined SIGUSR2
+ case SIGUSR2:
+ /* glibc, *BSD: "User defined signal 2". Solaris: "User signal 2". */
+ return "User defined signal 2";
+ #endif
+ #if defined SIGPOLL
+ case SIGPOLL:
+ /* glibc: "I/O possible". Solaris: "Pollable event". */
+ return "I/O possible";
+ #endif
+ #if defined SIGPROF
+ case SIGPROF:
+ return "Profiling timer expired";
+ #endif
+ #if defined SIGSYS
+ case SIGSYS:
+ return "Bad system call";
+ #endif
+ #if defined SIGTRAP
+ case SIGTRAP:
+ /* glibc, Solaris: "Trace/breakpoint trap". *BSD: "Trace/BPT trap". */
+ return "Trace/breakpoint trap";
+ #endif
+ #if defined SIGURG
+ case SIGURG:
+ /* glibc, *BSD: "Urgent I/O condition". Solaris: "Urgent socket condition". */
+ return "Urgent I/O condition";
+ #endif
+ #if defined SIGVTALRM
+ case SIGVTALRM:
+ return "Virtual timer expired";
+ #endif
+ #if defined SIGXCPU
+ case SIGXCPU:
+ /* glibc, *BSD: "CPU time limit exceeded". Solaris: "Cpu limit exceeded". */
+ return "CPU time limit exceeded";
+ #endif
+ #if defined SIGXFSZ
+ case SIGXFSZ:
+ return "File size limit exceeded";
+ #endif
+
+ /* Other signals on other systems. */
+ /* native Windows */
+ #if defined SIGBREAK
+ case SIGBREAK:
+ return "Ctrl-Break";
+ #endif
+ /* IRIX */
+ #if defined SIGCKPT
+ case SIGCKPT:
+ return "Checkpoint"; /* See man 1 cpr, man 3C atcheckpoint */
+ #endif
+ /* Linux, IRIX, Cygwin */
+ #if defined SIGCLD && SIGCLD != SIGCHLD
+ case SIGCLD:
+ return "Child stopped or exited";
+ #endif
+ /* AIX */
+ #if defined SIGCPUFAIL
+ case SIGCPUFAIL:
+ /* AIX: "CPU failure predicted". */
+ return "CPU going down"; /* See man bindprocessor */
+ #endif
+ /* AIX */
+ #if defined SIGDANGER
+ case SIGDANGER:
+ /* AIX: "Paging space low". */
+ return "Swap space nearly exhausted";
+ #endif
+ /* Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, AIX, IRIX, Cygwin, mingw */
+ #if defined SIGEMT
+ case SIGEMT:
+ /* glibc/Hurd, *BSD: "EMT trap". Solaris: "Emulation trap". */
+ return "Instruction emulation needed";
+ #endif
+ /* Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix */
+ #if defined SIGINFO
+ case SIGINFO:
+ return "Information request";
+ #endif
+ /* Linux, Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, AIX, IRIX, Cygwin */
+ #if defined SIGIO && SIGIO != SIGPOLL
+ case SIGIO:
+ return "I/O possible";
+ #endif
+ /* Linux, IRIX, Cygwin, mingw */
+ #if defined SIGIOT && SIGIOT != SIGABRT
+ case SIGIOT:
+ return "IOT instruction"; /* a PDP-11 instruction */
+ #endif
+ /* AIX */
+ #if defined SIGKAP
+ case SIGKAP:
+ /* Process must issue a KSKAPACK ioctl, or will be killed in 30 seconds. */
+ /* AIX: "Monitor mode granted". */
+ return "Keep Alive Poll";
+ #endif
+ /* Haiku */
+ #if defined SIGKILLTHR
+ case SIGKILLTHR:
+ return "Kill thread";
+ #endif
+ /* Minix */
+ #if defined SIGKMEM
+ case SIGKMEM:
+ return "Kernel memory request";
+ #endif
+ /* Minix */
+ #if defined SIGKMESS
+ case SIGKMESS:
+ return "Kernel message";
+ #endif
+ /* Minix */
+ #if defined SIGKSIG
+ case SIGKSIG:
+ return "Kernel signal";
+ #endif
+ /* Minix */
+ #if defined SIGKSIGSM
+ case SIGKSIGSM:
+ return "Kernel signal for signal manager";
+ #endif
+ /* FreeBSD */
+ #if defined SIGLIBRT
+ case SIGLIBRT:
+ return "Real-time library interrupt";
+ #endif
+ /* Cygwin */
+ #if defined SIGLOST && SIGLOST != SIGABRT && SIGLOST != SIGPWR
+ case SIGLOST:
+ /* Solaris: "Resource lost". */
+ return "File lock lost";
+ #endif
+ /* AIX */
+ #if defined SIGMIGRATE
+ case SIGMIGRATE:
+ return "Process migration";
+ #endif
+ /* AIX */
+ #if defined SIGMSG
+ case SIGMSG:
+ /* AIX: "Input device data". */
+ return "Message in the ring";
+ #endif
+ /* ACM */
+ #if defined SIGPLAN
+ case SIGPLAN:
+ return "Programming language anomaly";
+ #endif
+ /* AIX */
+ #if defined SIGPRE
+ case SIGPRE:
+ return "Programmed exception";
+ #endif
+ /* IRIX */
+ #if defined SIGPTINTR
+ case SIGPTINTR:
+ return "Pthread interrupt";
+ #endif
+ /* IRIX */
+ #if defined SIGPTRESCHED
+ case SIGPTRESCHED:
+ return "Pthread rescheduling";
+ #endif
+ /* Linux, NetBSD, Minix, AIX, IRIX, Cygwin */
+ #if defined SIGPWR
+ case SIGPWR:
+ /* glibc: "Power failure". NetBSD: "Power fail/restart". */
+ return "Power failure";
+ #endif
+ /* AIX */
+ #if defined SIGRECONFIG
+ case SIGRECONFIG:
+ return "Dynamic logical partitioning changed";
+ #endif
+ /* AIX */
+ #if defined SIGRECOVERY
+ case SIGRECOVERY:
+ return "Kernel recovery";
+ #endif
+ /* IRIX */
+ #if defined SIGRESTART
+ case SIGRESTART:
+ return "Checkpoint restart"; /* See man 1 cpr, man 3C atrestart */
+ #endif
+ /* AIX */
+ #if defined SIGRETRACT
+ case SIGRETRACT:
+ /* AIX: "Monitor mode retracted". */
+ return "Retracting Keep Alive Poll";
+ #endif
+ /* AIX */
+ #if defined SIGSAK
+ case SIGSAK:
+ /* AIX: "Secure attention". */
+ return "Secure Attention Key";
+ #endif
+ /* ACM */
+ #if defined SIGSAM
+ case SIGSAM:
+ return "Symbolic computation failed";
+ #endif
+ /* Minix */
+ #if defined SIGSNDELAY
+ case SIGSNDELAY:
+ return "Done sending message";
+ #endif
+ /* AIX */
+ #if defined SIGSOUND
+ case SIGSOUND:
+ /* AIX: "Sound completed". */
+ return "Sound configuration changed";
+ #endif
+ /* Linux */
+ #if defined SIGSTKFLT
+ case SIGSTKFLT:
+ return "Stack fault";
+ #endif
+ /* AIX */
+ #if defined SIGSYSERROR
+ case SIGSYSERROR:
+ return "Kernel error";
+ #endif
+ /* AIX */
+ #if defined SIGTALRM
+ case SIGTALRM:
+ return "Thread alarm clock";
+ #endif
+ /* FreeBSD, OpenBSD */
+ #if defined SIGTHR
+ case SIGTHR:
+ /* OpenBSD: "Thread AST". */
+ return "Thread library interrupt";
+ #endif
+ /* IRIX */
+ #if defined SIGUME
+ case SIGUME:
+ return "Uncorrectable memory error";
+ #endif
+ /* AIX */
+ #if defined SIGVIRT
+ case SIGVIRT:
+ return "Virtual time alarm clock";
+ #endif
+ /* AIX */
+ #if defined SIGWAITING
+ case SIGWAITING:
+ /* AIX: "No runnable lwp". */
+ return "Thread waiting";
+ #endif
+ /* Linux, Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, AIX, IRIX, Cygwin, Haiku */
+ #if defined SIGWINCH
+ case SIGWINCH:
+ /* glibc: "Window changed". *BSD: "Window size changed" or "Window size changes". */
+ return "Window size changed";
+ #endif
+
+ default:
+ return NULL;
+ }
+}
diff --git a/lib/string.in.h b/lib/string.in.h
index 5134e11289d..776133c5eba 100644
--- a/lib/string.in.h
+++ b/lib/string.in.h
@@ -1060,6 +1060,21 @@ _GL_WARN_ON_USE (sigabbrev_np, "sigabbrev_np is unportable - "
# endif
#endif
+/* Return an English description string for the signal number SIG. */
+#if @GNULIB_SIGDESCR_NP@
+# if ! @HAVE_SIGDESCR_NP@
+_GL_FUNCDECL_SYS (sigdescr_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigdescr_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigdescr_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigdescr_np
+# if HAVE_RAW_DECL_SIGDESCR_NP
+_GL_WARN_ON_USE (sigdescr_np, "sigdescr_np is unportable - "
+ "use gnulib module sigdescr_np for portability");
+# endif
+#endif
+
#if @GNULIB_STRSIGNAL@
# if @REPLACE_STRSIGNAL@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
diff --git a/lib/verify.h b/lib/verify.h
index d485a0283a9..ca2a1540736 100644
--- a/lib/verify.h
+++ b/lib/verify.h
@@ -246,6 +246,13 @@ template <int w>
/* @assert.h omit start@ */
+#if defined __has_builtin
+/* <https://clang.llvm.org/docs/LanguageExtensions.html#builtin-functions> */
+# define _GL_HAS_BUILTIN_ASSUME __has_builtin (__builtin_assume)
+#else
+# define _GL_HAS_BUILTIN_ASSUME 0
+#endif
+
#if 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__))
# define _GL_HAS_BUILTIN_TRAP 1
#elif defined __has_builtin
@@ -305,14 +312,36 @@ template <int w>
Although assuming R can help a compiler generate better code or
diagnostics, performance can suffer if R uses hard-to-optimize
- features such as function calls not inlined by the compiler.
-
- Avoid Clang’s __builtin_assume, as clang 9.0.1 -Wassume can
- generate a bogus diagnostic "the argument to '__builtin_assume' has
- side effects that will be discarded" even when the argument has no
- side effects. */
-
-#if _GL_HAS_BUILTIN_UNREACHABLE
+ features such as function calls not inlined by the compiler. */
+
+/* Use __builtin_assume in preference to __builtin_unreachable, because
+ in clang versions 8.0.x and older, the definition based on
+ __builtin_assume has an effect on optimizations, whereas the definition
+ based on __builtin_unreachable does not. (GCC so far has only
+ __builtin_unreachable.) */
+#if _GL_HAS_BUILTIN_ASSUME
+/* Use __builtin_constant_p to help clang's data-flow analysis for the case
+ assume (0).
+ Use a temporary variable, to avoid a clang warning
+ "the argument to '__builtin_assume' has side effects that will be discarded"
+ if R contains invocations of functions not marked as 'const'.
+ The type of the temporary variable can't be __typeof__ (R), because that
+ does not work on bit field expressions. Use '_Bool' or 'bool' as type
+ instead. */
+# if defined __cplusplus
+# define assume(R) \
+ (__builtin_constant_p (R) && !(R) \
+ ? (void) __builtin_unreachable () \
+ : (void) ({ bool _gl_verify_temp = (R); \
+ __builtin_assume (_gl_verify_temp); }))
+# else
+# define assume(R) \
+ (__builtin_constant_p (R) && !(R) \
+ ? (void) __builtin_unreachable () \
+ : (void) ({ _Bool _gl_verify_temp = (R); \
+ __builtin_assume (_gl_verify_temp); }))
+# endif
+#elif _GL_HAS_BUILTIN_UNREACHABLE
# define assume(R) ((R) ? (void) 0 : __builtin_unreachable ())
#elif 1200 <= _MSC_VER
# define assume(R) __assume (R)
diff --git a/lisp/allout.el b/lisp/allout.el
index 05d9153a31d..955b7000cbf 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -62,8 +62,7 @@
;; The outline menubar additions provide quick reference to many of the
;; features. See the docstring of the variables `allout-layout' and
;; `allout-auto-activation' for details on automatic activation of
-;; `allout-mode' as a minor mode. (`allout-init' is deprecated in favor of
-;; a purely customization-based method.)
+;; `allout-mode' as a minor mode.
;;
;; Note -- the lines beginning with `;;;_' are outline topic headers.
;; Customize `allout-auto-activation' to enable, then revisit this
@@ -1627,18 +1626,6 @@ non-nil in a lasting way.")
"If t, `allout-mode's last deactivation was deliberate.
So `allout-post-command-business' should not reactivate it...")
(make-variable-buffer-local 'allout-explicitly-deactivated)
-;;;_ > allout-init (mode)
-(defun allout-init (mode)
- "DEPRECATED - configure allout activation by customizing
-`allout-auto-activation'. This function remains around, limited
-from what it did before, for backwards compatibility.
-
-MODE is the activation mode - see `allout-auto-activation' for
-valid values."
- (declare (obsolete allout-auto-activation "23.3"))
- (customize-set-variable 'allout-auto-activation (format "%s" mode))
- (format "%s" mode))
-
;;;_ > allout-setup-menubar ()
(defun allout-setup-menubar ()
"Populate the current buffer's menubar with `allout-mode' stuff."
diff --git a/lisp/auth-source.el b/lisp/auth-source.el
index 7a0e09b9e8e..50795ce7946 100644
--- a/lisp/auth-source.el
+++ b/lisp/auth-source.el
@@ -2073,7 +2073,9 @@ entries for git.gnus.org:
(setcar
(cdr secret)
(let ((v (car (cdr secret))))
- (lambda () v))))
+ (if (functionp v)
+ (lambda () (funcall v plist))
+ (lambda () v)))))
plist))
items))
;; ensure each item has each key in `returned-keys'
diff --git a/lisp/calendar/todo-mode.el b/lisp/calendar/todo-mode.el
index 4f513d33865..0e4446f77de 100644
--- a/lisp/calendar/todo-mode.el
+++ b/lisp/calendar/todo-mode.el
@@ -6440,8 +6440,7 @@ Filtered Items mode following todo (not done) items."
("i" todo-insert-item)
("k" todo-delete-item)
("m" todo-move-item)
- ("u" todo-item-undone)
- ([remap newline] newline-and-indent))
+ ("u" todo-item-undone))
"List of key bindings for Todo mode only.")
(defvar todo-key-bindings-t+a+f
@@ -6507,7 +6506,6 @@ Filtered Items mode following todo (not done) items."
(defvar todo-edit-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "\C-x\C-q" 'todo-edit-quit)
- (define-key map [remap newline] 'newline-and-indent)
map)
"Todo Edit mode keymap.")
@@ -6666,7 +6664,6 @@ Added to `window-configuration-change-hook' in Todo mode."
(setq-local font-lock-defaults '(todo-font-lock-keywords t))
(setq-local revert-buffer-function #'todo-revert-buffer)
(setq-local tab-width todo-indent-to-here)
- (setq-local indent-line-function #'todo-indent)
(when todo-wrap-lines
(visual-line-mode)
(setq wrap-prefix (make-string todo-indent-to-here 32))))
@@ -6741,6 +6738,7 @@ Added to `window-configuration-change-hook' in Todo mode."
\\{todo-edit-mode-map}"
(todo-modes-set-1)
+ (setq-local indent-line-function #'todo-indent)
(if (> (buffer-size) (- (point-max) (point-min)))
;; Editing one item in an indirect buffer, so buffer-file-name is nil.
(setq-local todo-current-todo-file todo-global-current-todo-file)
diff --git a/lisp/cedet/data-debug.el b/lisp/cedet/data-debug.el
index 604fc40926c..44cce389cb3 100644
--- a/lisp/cedet/data-debug.el
+++ b/lisp/cedet/data-debug.el
@@ -38,7 +38,7 @@
;; "Calculate something complicated at point, and return it."
;; (interactive) ;; function not normally interactive
;; (let ((stuff (do-stuff)))
-;; (when (interactive-p)
+;; (when (called-interactively-p 'interactive)
;; (data-debug-show-stuff stuff "myStuff"))
;; stuff))
diff --git a/lisp/comint.el b/lisp/comint.el
index 092902d865e..be0e32b9e09 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -3450,7 +3450,7 @@ the completions."
(eq (window-buffer (posn-window (event-start first)))
(get-buffer "*Completions*"))
(memq (key-binding key)
- '(mouse-choose-completion choose-completion))))
+ '(choose-completion))))
;; If the user does choose-completion with the mouse,
;; execute the command, then delete the completion window.
(progn
diff --git a/lisp/custom.el b/lisp/custom.el
index db7f6a056d4..7581457ce8d 100644
--- a/lisp/custom.el
+++ b/lisp/custom.el
@@ -758,6 +758,9 @@ Return non-nil if the `customized-value' property actually changed."
(progn (put symbol 'customized-value (list (custom-quote value)))
(custom-push-theme 'theme-value symbol 'user 'set
(custom-quote value)))
+ (custom-push-theme 'theme-value symbol 'user
+ (if (get symbol 'saved-value) 'set 'reset)
+ (custom-quote value))
(put symbol 'customized-value nil))
;; Changed?
(not (equal customized (get symbol 'customized-value)))))
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index c197ed04fe2..ab13b3e26ea 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -134,7 +134,20 @@ the string of command switches used as the third argument of `diff'."
(file-name-directory default)
(dired-current-directory))
(dired-dwim-target-directory)))
- (defaults (dired-dwim-target-defaults (list current) target-dir)))
+ (defaults (append
+ (if (backup-file-name-p current)
+ ;; This is a backup file -- put the other
+ ;; main file, and the other backup files into
+ ;; the `M-n' list.
+ (delete (expand-file-name current)
+ (cons (expand-file-name
+ (file-name-sans-versions current))
+ (file-backup-file-names
+ (file-name-sans-versions current))))
+ ;; Non-backup file -- use the backup files as
+ ;; `M-n' candidates.
+ (file-backup-file-names current))
+ (dired-dwim-target-defaults (list current) target-dir))))
(list
(minibuffer-with-setup-hook
(lambda ()
diff --git a/lisp/dired.el b/lisp/dired.el
index 94d3befda85..d122869a5e3 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -534,6 +534,14 @@ Subexpression 2 must end right before the \\n.")
(defvar dired-symlink-face 'dired-symlink
"Face name used for symbolic links.")
+(defface dired-broken-symlink
+ '((((class color))
+ :foreground "yellow1" :background "red1" :weight bold)
+ (t :weight bold :slant italic :underline t))
+ "Face used for broken symbolic links."
+ :group 'dired-faces
+ :version "28.1")
+
(defface dired-special
'((t (:inherit font-lock-variable-name-face)))
"Face used for sockets, pipes, block devices and char devices."
@@ -597,6 +605,20 @@ Subexpression 2 must end right before the \\n.")
(list dired-re-dir
'(".+" (dired-move-to-filename) nil (0 dired-directory-face)))
;;
+ ;; Broken Symbolic link.
+ (list dired-re-sym
+ (list (lambda (end)
+ (let* ((file (dired-file-name-at-point))
+ (truename (ignore-errors (file-truename file))))
+ ;; either not existent target or circular link
+ (and (not (and truename (file-exists-p truename)))
+ (search-forward-regexp "\\(.+\\) \\(->\\) ?\\(.+\\)" end t))))
+ '(dired-move-to-filename)
+ nil
+ '(1 'dired-broken-symlink)
+ '(2 dired-symlink-face)
+ '(3 'dired-broken-symlink)))
+ ;;
;; Symbolic link to a directory.
(list dired-re-sym
(list (lambda (end)
@@ -2244,8 +2266,15 @@ Do so according to the former subdir alist OLD-SUBDIR-ALIST."
'(menu-item "Shell Command..." dired-do-shell-command
:help "Run a shell command on current or marked files"))
(define-key map [menu-bar operate delete]
- '(menu-item "Delete" dired-do-delete
- :help "Delete current file or all marked files"))
+ `(menu-item "Delete"
+ ,(let ((menu (make-sparse-keymap "Delete")))
+ (define-key menu [delete-flagged]
+ '(menu-item "Delete Flagged Files" dired-do-flagged-delete
+ :help "Delete all files flagged for deletion (D)"))
+ (define-key menu [delete-marked]
+ '(menu-item "Delete Marked (Not Flagged) Files" dired-do-delete
+ :help "Delete current file or all marked files (excluding flagged files)"))
+ menu)))
(define-key map [menu-bar operate rename]
'(menu-item "Rename to..." dired-do-rename
:help "Rename current file or move marked files"))
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index 77c06a8eaf9..60f6d6350c9 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -1320,26 +1320,31 @@ dragging it to its bottom-right corner. See also
(defun doc-view-get-bounding-box ()
"Get the BoundingBox information of the current page."
- (let* ((page (doc-view-current-page))
- (doc (let ((cache-doc (doc-view-current-cache-doc-pdf)))
- (if (file-exists-p cache-doc)
- cache-doc
- doc-view--buffer-file-name)))
- (o (shell-command-to-string
- (concat doc-view-ghostscript-program
- " -dSAFER -dBATCH -dNOPAUSE -q -sDEVICE=bbox "
- (format "-dFirstPage=%s -dLastPage=%s %s"
- page page doc)))))
- (save-match-data
- (when (string-match (concat "%%BoundingBox: "
- "\\([[:digit:]]+\\) \\([[:digit:]]+\\) "
- "\\([[:digit:]]+\\) \\([[:digit:]]+\\)")
- o)
- (mapcar #'string-to-number
- (list (match-string 1 o)
- (match-string 2 o)
- (match-string 3 o)
- (match-string 4 o)))))))
+ (let ((page (doc-view-current-page))
+ (doc (let ((cache-doc (doc-view-current-cache-doc-pdf)))
+ (if (file-exists-p cache-doc)
+ cache-doc
+ doc-view--buffer-file-name))))
+ (with-temp-buffer
+ (when (eq 0 (ignore-errors
+ (process-file doc-view-ghostscript-program nil t
+ nil "-dSAFER" "-dBATCH" "-dNOPAUSE" "-q"
+ "-sDEVICE=bbox"
+ (format "-dFirstPage=%s" page)
+ (format "-dLastPage=%s" page)
+ doc)))
+ (goto-char (point-min))
+ (save-match-data
+ (when (re-search-forward
+ (concat "%%BoundingBox: "
+ "\\([[:digit:]]+\\) \\([[:digit:]]+\\) "
+ "\\([[:digit:]]+\\) \\([[:digit:]]+\\)")
+ nil t)
+ (mapcar #'string-to-number
+ (list (match-string 1)
+ (match-string 2)
+ (match-string 3)
+ (match-string 4)))))))))
(defvar doc-view-paper-sizes
'((a4 595 842)
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 507cfe76ffa..4a2a8c62cbc 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -4213,40 +4213,44 @@ Return (TAIL VAR TEST CASES), where:
(switch-var nil)
(switch-test 'eq))
(while (pcase (car clauses)
- (`((,fn ,expr1 ,expr2) . ,body)
+ (`((,(and fn (or 'eq 'eql 'equal)) ,expr1 ,expr2) . ,body)
(let* ((vars (byte-compile--cond-vars expr1 expr2))
(var (car vars))
(value (cdr vars)))
(and var (or (eq var switch-var) (not switch-var))
- (cond
- ((memq fn '(eq eql equal))
+ (progn
(setq switch-var var)
(setq switch-test
(byte-compile--common-test switch-test fn))
(unless (member value keys)
(push value keys)
(push (cons (list value) (or body '(t))) cases))
- t)
- ((and (memq fn '(memq memql member))
- (listp value)
- ;; Require a non-empty body, since the member
- ;; function value depends on the switch
- ;; argument.
- body)
- (setq switch-var var)
- (setq switch-test
- (byte-compile--common-test
- switch-test (cdr (assq fn '((memq . eq)
- (memql . eql)
- (member . equal))))))
- (let ((vals nil))
- (dolist (elem value)
- (unless (funcall fn elem keys)
- (push elem vals)))
- (when vals
- (setq keys (append vals keys))
- (push (cons (nreverse vals) body) cases)))
- t))))))
+ t))))
+ (`((,(and fn (or 'memq 'memql 'member)) ,var ,expr) . ,body)
+ (and (symbolp var)
+ (or (eq var switch-var) (not switch-var))
+ (macroexp-const-p expr)
+ ;; Require a non-empty body, since the member
+ ;; function value depends on the switch argument.
+ body
+ (let ((value (eval expr)))
+ (and (proper-list-p value)
+ (progn
+ (setq switch-var var)
+ (setq switch-test
+ (byte-compile--common-test
+ switch-test
+ (cdr (assq fn '((memq . eq)
+ (memql . eql)
+ (member . equal))))))
+ (let ((vals nil))
+ (dolist (elem value)
+ (unless (funcall fn elem keys)
+ (push elem vals)))
+ (when vals
+ (setq keys (append vals keys))
+ (push (cons (nreverse vals) body) cases)))
+ t))))))
(setq clauses (cdr clauses)))
;; Assume that a single switch is cheaper than two or more discrete
;; compare clauses. This could be tuned, possibly taking into
diff --git a/lisp/emacs-lisp/cl-lib.el b/lisp/emacs-lisp/cl-lib.el
index 7a26d9a90fd..7a4d3c9c3e3 100644
--- a/lisp/emacs-lisp/cl-lib.el
+++ b/lisp/emacs-lisp/cl-lib.el
@@ -619,8 +619,11 @@ If ALIST is non-nil, the new pairs are prepended to it."
(macroexp-let2* nil ((start from) (end to))
(funcall do `(substring ,getter ,start ,end)
(lambda (v)
- (funcall setter `(cl--set-substring
- ,getter ,start ,end ,v))))))))
+ (macroexp-let2 nil v v
+ `(progn
+ ,(funcall setter `(cl--set-substring
+ ,getter ,start ,end ,v))
+ ,v))))))))
;;; Miscellaneous.
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index d9bbf6129c6..7ff6d68c3ec 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -1229,7 +1229,7 @@ purpose by adding an entry to this alist, and setting
"Wrap the FORMS of a definition body."
(if edebug-def-interactive
`(let ((,(edebug-interactive-p-name)
- (interactive-p)))
+ (called-interactively-p 'interactive)))
,(edebug-make-enter-wrapper forms))
(edebug-make-enter-wrapper forms)))
diff --git a/lisp/emacs-lisp/eieio-base.el b/lisp/emacs-lisp/eieio-base.el
index 2cb1f614ce3..39ad30afc5a 100644
--- a/lisp/emacs-lisp/eieio-base.el
+++ b/lisp/emacs-lisp/eieio-base.el
@@ -252,119 +252,87 @@ being pedantic."
(error
"Invalid object: %s is not an object of class %s nor a subclass"
(car ret) class))
- (setq ret (eieio-persistent-convert-list-to-object ret))
+ (setq ret (eieio-persistent-make-instance (car ret) (cdr ret)))
(oset ret file filename))
(kill-buffer " *tmp eieio read*"))
ret))
-(defun eieio-persistent-convert-list-to-object (inputlist)
- "Convert the INPUTLIST, representing object creation to an object.
-While it is possible to just `eval' the INPUTLIST, this code instead
-validates the existing list, and explicitly creates objects instead of
-calling eval. This avoids the possibility of accidentally running
-malicious code.
-
-Note: This function recurses when a slot of :type of some object is
-identified, and needing more object creation."
- (let* ((objclass (nth 0 inputlist))
- ;; Earlier versions of `object-write' added a string name for
- ;; the object, now obsolete.
- (slots (nthcdr
- (if (stringp (nth 1 inputlist)) 2 1)
- inputlist))
- (createslots nil)
- (class
- (progn
- ;; If OBJCLASS is an eieio autoload object, then we need to
- ;; load it.
- (eieio--full-class-object objclass))))
-
- (while slots
- (let ((initarg (car slots))
- (value (car (cdr slots))))
-
- ;; Make sure that the value proposed for SLOT is valid.
- ;; In addition, strip out quotes, list functions, and update
- ;; object constructors as needed.
- (setq value (eieio-persistent-validate/fix-slot-value
- class (eieio--initarg-to-attribute class initarg) value))
-
- (push initarg createslots)
- (push value createslots)
- )
-
- (setq slots (cdr (cdr slots))))
-
- (apply #'make-instance objclass (nreverse createslots))
-
- ;;(eval inputlist)
- ))
-
-(defun eieio-persistent-validate/fix-slot-value (class slot proposed-value)
- "Validate that in CLASS, the SLOT with PROPOSED-VALUE is good, then fix.
-A limited number of functions, such as quote, list, and valid object
-constructor functions are considered valid.
-Second, any text properties will be stripped from strings."
+(cl-defgeneric eieio-persistent-make-instance (objclass inputlist)
+ "Convert INPUTLIST, representing slot values, to an instance of OBJCLASS.
+Clean slot values, and possibly recursively create additional
+objects found there."
+ (:method
+ ((objclass (subclass eieio-default-superclass)) inputlist)
+
+ (let ((slots (if (stringp (car inputlist))
+ ;; Earlier versions of `object-write' added a
+ ;; string name for the object, now obsolete.
+ (cdr inputlist)
+ inputlist))
+ (createslots nil))
+ ;; If OBJCLASS is an eieio autoload object, then we need to
+ ;; load it (we don't need the return value).
+ (eieio--full-class-object objclass)
+ (while slots
+ (let ((initarg (car slots))
+ (value (car (cdr slots))))
+
+ ;; Strip out quotes, list functions, and update object
+ ;; constructors as needed.
+ (setq value (eieio-persistent-fix-value value))
+
+ (push initarg createslots)
+ (push value createslots))
+
+ (setq slots (cdr (cdr slots))))
+
+ (apply #'make-instance objclass (nreverse createslots)))))
+
+(defun eieio-persistent-fix-value (proposed-value)
+ "Fix PROPOSED-VALUE.
+Remove leading quotes from lists, and the symbol `list' from the
+head of lists. Explicitly construct any objects found, and strip
+any text properties from string values.
+
+This function will descend into the contents of lists, hash
+tables, and vectors."
(cond ((consp proposed-value)
;; Lists with something in them need special treatment.
- (let* ((slot-idx (- (eieio--slot-name-index class slot)
- (eval-when-compile eieio--object-num-slots)))
- (type (cl--slot-descriptor-type (aref (eieio--class-slots class)
- slot-idx)))
- (classtype (eieio-persistent-slot-type-is-class-p type)))
-
- (cond ((eq (car proposed-value) 'quote)
- (car (cdr proposed-value)))
-
- ;; An empty list sometimes shows up as (list), which is dumb, but
- ;; we need to support it for backward compat.
- ((and (eq (car proposed-value) 'list)
- (= (length proposed-value) 1))
- nil)
-
- ;; List of object constructors.
- ((and (eq (car proposed-value) 'list)
- ;; 2nd item is a list.
- (consp (car (cdr proposed-value)))
- ;; 1st elt of 2nd item is a class name.
- (class-p (car (car (cdr proposed-value))))
- )
-
- ;; Check the value against the input class type.
- ;; If something goes wrong, issue a smart warning
- ;; about how a :type is needed for this to work.
- (unless (and
- ;; Do we have a type?
- (consp classtype) (class-p (car classtype)))
- (error "In save file, list of object constructors found, but no :type specified for slot %S of type %S"
- slot classtype))
-
- ;; We have a predicate, but it doesn't satisfy the predicate?
- (dolist (PV (cdr proposed-value))
- (unless (child-of-class-p (car PV) (car classtype))
- (error "Invalid object: slot member %s does not match class %s"
- (car PV) (car classtype))))
-
- ;; We have a list of objects here. Lets load them
- ;; in.
- (let ((objlist nil))
- (dolist (subobj (cdr proposed-value))
- (push (eieio-persistent-convert-list-to-object subobj)
- objlist))
- ;; return the list of objects ... reversed.
- (nreverse objlist)))
- ;; We have a slot with a single object that can be
- ;; saved here. Recurse and evaluate that
- ;; sub-object.
- ((and classtype
- (seq-some
- (lambda (elt)
- (child-of-class-p (car proposed-value) elt))
- (if (listp classtype) classtype (list classtype))))
- (eieio-persistent-convert-list-to-object
- proposed-value))
- (t
- proposed-value))))
+ (cond ((eq (car proposed-value) 'quote)
+ (while (eq (car-safe proposed-value) 'quote)
+ (setq proposed-value (car (cdr proposed-value))))
+ proposed-value)
+
+ ;; An empty list sometimes shows up as (list), which is dumb, but
+ ;; we need to support it for backward compar.
+ ((and (eq (car proposed-value) 'list)
+ (= (length proposed-value) 1))
+ nil)
+
+ ;; List of object constructors.
+ ((and (eq (car proposed-value) 'list)
+ ;; 2nd item is a list.
+ (consp (car (cdr proposed-value)))
+ ;; 1st elt of 2nd item is a class name.
+ (class-p (car (car (cdr proposed-value)))))
+
+ ;; We have a list of objects here. Lets load them
+ ;; in.
+ (let ((objlist nil))
+ (dolist (subobj (cdr proposed-value))
+ (push (eieio-persistent-make-instance
+ (car subobj) (cdr subobj))
+ objlist))
+ ;; return the list of objects ... reversed.
+ (nreverse objlist)))
+ ;; We have a slot with a single object that can be
+ ;; saved here. Recurse and evaluate that
+ ;; sub-object.
+ ((class-p (car proposed-value))
+ (eieio-persistent-make-instance
+ (car proposed-value) (cdr proposed-value)))
+ (t
+ proposed-value)))
;; For hash-tables and vectors, the top-level `read' will not
;; "look inside" member values, so we need to do that
;; explicitly. Because `eieio-override-prin1' is recursive in
@@ -375,10 +343,9 @@ Second, any text properties will be stripped from strings."
(lambda (key value)
(setf (gethash key proposed-value)
(if (class-p (car-safe value))
- (eieio-persistent-convert-list-to-object
- value)
- (eieio-persistent-validate/fix-slot-value
- class slot value))))
+ (eieio-persistent-make-instance
+ (car value) (cdr value))
+ (eieio-persistent-fix-value value))))
proposed-value)
proposed-value)
@@ -387,72 +354,18 @@ Second, any text properties will be stripped from strings."
(let ((val (aref proposed-value i)))
(aset proposed-value i
(if (class-p (car-safe val))
- (eieio-persistent-convert-list-to-object
- val)
- (eieio-persistent-validate/fix-slot-value
- class slot val)))))
+ (eieio-persistent-make-instance
+ (car val) (cdr val))
+ (eieio-persistent-fix-value val)))))
proposed-value)
- ((stringp proposed-value)
- ;; Else, check for strings, remove properties.
- (substring-no-properties proposed-value))
-
- (t
- ;; Else, just return whatever the constant was.
- proposed-value))
- )
-
-(defun eieio-persistent-slot-type-is-class-p (type)
- "Return the class referred to in TYPE.
-If no class is referenced there, then return nil."
- (cond ((class-p type)
- ;; If the type is a class, then return it.
- type)
- ((and (eq 'list-of (car-safe type)) (class-p (cadr type)))
- ;; If it is the type of a list of a class, then return that class and
- ;; the type.
- (cons (cadr type) type))
-
- ((and (symbolp type) (get type 'cl-deftype-handler))
- ;; Macro-expand the type according to cl-deftype definitions.
- (eieio-persistent-slot-type-is-class-p
- (funcall (get type 'cl-deftype-handler))))
-
- ;; FIXME: foo-child should not be a valid type!
- ((and (symbolp type) (string-match "-child\\'" (symbol-name type))
- (class-p (intern-soft (substring (symbol-name type) 0
- (match-beginning 0)))))
- (unless eieio-backward-compatibility
- (error "Use of bogus %S type instead of %S"
- type (intern-soft (substring (symbol-name type) 0
- (match-beginning 0)))))
- ;; If it is the predicate ending with -child, then return
- ;; that class. Unfortunately, in EIEIO, typep of just the
- ;; class is the same as if we used -child, so no further work needed.
- (intern-soft (substring (symbol-name type) 0
- (match-beginning 0))))
- ;; FIXME: foo-list should not be a valid type!
- ((and (symbolp type) (string-match "-list\\'" (symbol-name type))
- (class-p (intern-soft (substring (symbol-name type) 0
- (match-beginning 0)))))
- (unless eieio-backward-compatibility
- (error "Use of bogus %S type instead of (list-of %S)"
- type (intern-soft (substring (symbol-name type) 0
- (match-beginning 0)))))
- ;; If it is the predicate ending with -list, then return
- ;; that class and the predicate to use.
- (cons (intern-soft (substring (symbol-name type) 0
- (match-beginning 0)))
- type))
-
- ((eq (car-safe type) 'or)
- ;; If type is a list, and is an `or', return all valid class
- ;; types within the `or' statement.
- (seq-filter #'eieio-persistent-slot-type-is-class-p (cdr type)))
+ ((stringp proposed-value)
+ ;; Else, check for strings, remove properties.
+ (substring-no-properties proposed-value))
(t
- ;; No match, not a class.
- nil)))
+ ;; Else, just return whatever the constant was.
+ proposed-value)))
(cl-defmethod object-write ((this eieio-persistent) &optional comment)
"Write persistent object THIS out to the current stream.
diff --git a/lisp/emacs-lisp/gv.el b/lisp/emacs-lisp/gv.el
index 513bd328899..78d86b9fc31 100644
--- a/lisp/emacs-lisp/gv.el
+++ b/lisp/emacs-lisp/gv.el
@@ -527,9 +527,12 @@ This macro only makes sense when used in a place."
(gv-letplace (dgetter dsetter) d
(funcall do
`(cons ,agetter ,dgetter)
- (lambda (v) `(progn
- ,(funcall asetter `(car ,v))
- ,(funcall dsetter `(cdr ,v)))))))))
+ (lambda (v)
+ (macroexp-let2 nil v v
+ `(progn
+ ,(funcall asetter `(car ,v))
+ ,(funcall dsetter `(cdr ,v))
+ ,v))))))))
(put 'logand 'gv-expander
(lambda (do place &rest masks)
@@ -539,9 +542,12 @@ This macro only makes sense when used in a place."
(funcall
do `(logand ,getter ,mask)
(lambda (v)
- (funcall setter
- `(logior (logand ,v ,mask)
- (logand ,getter (lognot ,mask))))))))))
+ (macroexp-let2 nil v v
+ `(progn
+ ,(funcall setter
+ `(logior (logand ,v ,mask)
+ (logand ,getter (lognot ,mask))))
+ ,v))))))))
;;; References
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 584ed8c6f90..352210f859d 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -506,9 +506,7 @@ This will generate compile-time constants from BINDINGS."
(1 font-lock-constant-face prepend))
;; Uninterned symbols, e.g., (defpackage #:my-package ...)
;; must come before keywords below to have effect
- (,(concat "\\(#:\\)\\(" lisp-mode-symbol-regexp "\\)")
- (1 font-lock-comment-delimiter-face)
- (2 font-lock-doc-face))
+ (,(concat "#:" lisp-mode-symbol-regexp "") 0 font-lock-builtin-face)
;; Constant values.
(,(concat "\\_<:" lisp-mode-symbol-regexp "\\_>")
(0 font-lock-builtin-face))
diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el
index 85a15c96be5..b779aa27888 100644
--- a/lisp/emacs-lisp/nadvice.el
+++ b/lisp/emacs-lisp/nadvice.el
@@ -5,18 +5,20 @@
;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
;; Keywords: extensions, lisp, tools
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 1cc68e19edd..d60f974aee1 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -4,7 +4,7 @@
;; Author: Nicolas Petton <nicolas@petton.fr>
;; Keywords: sequences
-;; Version: 2.21
+;; Version: 2.22
;; Package: seq
;; Maintainer: emacs-devel@gnu.org
diff --git a/lisp/emacs-lisp/shadow.el b/lisp/emacs-lisp/shadow.el
index 4ff129e367a..dd614dd792c 100644
--- a/lisp/emacs-lisp/shadow.el
+++ b/lisp/emacs-lisp/shadow.el
@@ -55,9 +55,6 @@
:prefix "load-path-shadows-"
:group 'lisp)
-(define-obsolete-variable-alias 'shadows-compare-text-p
- 'load-path-shadows-compare-text "23.3")
-
(defcustom load-path-shadows-compare-text nil
"If non-nil, then shadowing files are reported only if their text differs.
This is slower, but filters out some innocuous shadowing."
diff --git a/lisp/emacs-lisp/warnings.el b/lisp/emacs-lisp/warnings.el
index cd960618a0a..b1fd6ed80ad 100644
--- a/lisp/emacs-lisp/warnings.el
+++ b/lisp/emacs-lisp/warnings.el
@@ -1,4 +1,4 @@
-;;; warnings.el --- log and display warnings
+;;; warnings.el --- log and display warnings -*- lexical-binding:t -*-
;; Copyright (C) 2002-2020 Free Software Foundation, Inc.
@@ -68,25 +68,25 @@ Each element looks like (ALIAS . LEVEL) and defines ALIAS as
equivalent to LEVEL. LEVEL must be defined in `warning-levels';
it may not itself be an alias.")
-(defvaralias 'display-warning-minimum-level 'warning-minimum-level)
+(define-obsolete-variable-alias 'display-warning-minimum-level
+ 'warning-minimum-level "28.1")
(defcustom warning-minimum-level :warning
"Minimum severity level for displaying the warning buffer.
If a warning's severity level is lower than this,
the warning is logged in the warnings buffer, but the buffer
is not immediately displayed. See also `warning-minimum-log-level'."
- :group 'warnings
:type '(choice (const :emergency) (const :error)
(const :warning) (const :debug))
:version "22.1")
-(defvaralias 'log-warning-minimum-level 'warning-minimum-log-level)
+(define-obsolete-variable-alias 'log-warning-minimum-level
+ 'warning-minimum-log-level "28.1")
(defcustom warning-minimum-log-level :warning
"Minimum severity level for logging a warning.
If a warning severity level is lower than this,
the warning is completely ignored.
Value must be lower or equal than `warning-minimum-level',
because warnings not logged aren't displayed either."
- :group 'warnings
:type '(choice (const :emergency) (const :error)
(const :warning) (const :debug))
:version "22.1")
@@ -100,7 +100,6 @@ Thus, (foo bar) as an element matches (foo bar)
or (foo bar ANYTHING...) as TYPE.
If TYPE is a symbol FOO, that is equivalent to the list (FOO),
so only the element (FOO) will match it."
- :group 'warnings
:type '(repeat (repeat symbol))
:version "22.1")
@@ -115,7 +114,6 @@ or (foo bar ANYTHING...) as TYPE.
If TYPE is a symbol FOO, that is equivalent to the list (FOO),
so only the element (FOO) will match it.
See also `warning-suppress-log-types'."
- :group 'warnings
:type '(repeat (repeat symbol))
:version "22.1")
diff --git a/lisp/epa-file.el b/lisp/epa-file.el
index 3b0cc84e5f6..bb027b9abfb 100644
--- a/lisp/epa-file.el
+++ b/lisp/epa-file.el
@@ -175,9 +175,9 @@ encryption is used."
(setq-local epa-file-error error)
(add-hook 'find-file-not-found-functions
'epa-file--find-file-not-found-function
- nil t)
- (signal (if exists 'file-error 'file-missing)
- (cons "Opening input file" (cdr error))))))))
+ nil t)))
+ (signal (if exists 'file-error 'file-missing)
+ (cons "Opening input file" (cdr error))))))
(set-buffer buf) ;In case timer/filter changed/killed it (bug#16029)!
(setq-local epa-file-encrypt-to
(mapcar #'car (epg-context-result-for
diff --git a/lisp/epa.el b/lisp/epa.el
index 5140d3f0a69..b065887cef1 100644
--- a/lisp/epa.el
+++ b/lisp/epa.el
@@ -25,10 +25,7 @@
(require 'epg)
(require 'font-lock)
-(require 'widget)
-(eval-when-compile
- (require 'subr-x)
- (require 'wid-edit))
+(eval-when-compile (require 'subr-x))
(require 'derived)
;;; Options
@@ -153,14 +150,6 @@ The command `epa-mail-encrypt' uses this."
;;; Variables
-(defvar epa-font-lock-keywords
- '(("^\\*"
- (0 'epa-mark))
- ("^\t\\([^\t:]+:\\)[ \t]*\\(.*\\)$"
- (1 'epa-field-name)
- (2 'epa-field-body)))
- "Default expressions to addon in epa-mode.")
-
(defconst epa-pubkey-algorithm-letter-alist
'((1 . ?R)
(2 . ?r)
@@ -197,8 +186,9 @@ You should bind this variable with `let', but do not set it globally.")
(defvar epa-key-list-mode-map
(let ((keymap (make-sparse-keymap))
(menu-map (make-sparse-keymap)))
- (set-keymap-parent keymap widget-keymap)
(define-key keymap "\C-m" 'epa-show-key)
+ (define-key keymap [?\t] 'forward-button)
+ (define-key keymap [backtab] 'backward-button)
(define-key keymap "m" 'epa-mark-key)
(define-key keymap "u" 'epa-unmark-key)
(define-key keymap "d" 'epa-decrypt-file)
@@ -259,48 +249,35 @@ You should bind this variable with `let', but do not set it globally.")
(defvar epa-exit-buffer-function #'quit-window)
-;;; Key Widget
-
-(define-widget 'epa-key 'push-button
- "Button for representing an epg-key object."
- :format "%[%v%]"
- :button-face-get 'epa--key-widget-button-face-get
- :value-create 'epa--key-widget-value-create
- :action 'epa--key-widget-action
- :help-echo 'epa--key-widget-help-echo)
-
-(defun epa--key-widget-action (widget &optional _event)
- (save-selected-window
- (epa--show-key (widget-get widget :value))))
-
-(defun epa--key-widget-value-create (widget)
- (let* ((key (widget-get widget :value))
- (primary-sub-key (car (epg-key-sub-key-list key)))
- (primary-user-id (car (epg-key-user-id-list key))))
- (insert (format "%c "
- (if (epg-sub-key-validity primary-sub-key)
- (car (rassq (epg-sub-key-validity primary-sub-key)
- epg-key-validity-alist))
- ? ))
- (epg-sub-key-id primary-sub-key)
- " "
- (if primary-user-id
- (if (stringp (epg-user-id-string primary-user-id))
- (epg-user-id-string primary-user-id)
- (epg-decode-dn (epg-user-id-string primary-user-id)))
- ""))))
-
-(defun epa--key-widget-button-face-get (widget)
- (let ((validity (epg-sub-key-validity (car (epg-key-sub-key-list
- (widget-get widget :value))))))
- (if validity
- (cdr (assq validity epa-validity-face-alist))
- 'default)))
-
-(defun epa--key-widget-help-echo (widget)
- (format "Show %s"
- (epg-sub-key-id (car (epg-key-sub-key-list
- (widget-get widget :value))))))
+(defun epa--button-key-text (key)
+ (let ((primary-sub-key (car (epg-key-sub-key-list key)))
+ (primary-user-id (car (epg-key-user-id-list key)))
+ (validity (epg-sub-key-validity (car (epg-key-sub-key-list key)))))
+ (propertize
+ (concat
+ (propertize
+ (format "%c "
+ (if (epg-sub-key-validity primary-sub-key)
+ (car (rassq (epg-sub-key-validity primary-sub-key)
+ epg-key-validity-alist))
+ ? ))
+ 'help-echo (format "Validity: %s"
+ (epg-sub-key-validity primary-sub-key)))
+ (propertize
+ (concat
+ (epg-sub-key-id primary-sub-key)
+ " "
+ (if primary-user-id
+ (if (stringp (epg-user-id-string primary-user-id))
+ (epg-user-id-string primary-user-id)
+ (epg-decode-dn (epg-user-id-string primary-user-id)))
+ ""))
+ 'help-echo (format "Show %s"
+ (epg-sub-key-id (car (epg-key-sub-key-list key))))))
+ 'face
+ (if validity
+ (cdr (assq validity epa-validity-face-alist))
+ 'default))))
;;; Modes
@@ -309,7 +286,6 @@ You should bind this variable with `let', but do not set it globally.")
(buffer-disable-undo)
(setq truncate-lines t
buffer-read-only t)
- (setq-local font-lock-defaults '(epa-font-lock-keywords t))
(make-local-variable 'epa-exit-buffer-function)
(setq-local revert-buffer-function #'epa--key-list-revert-buffer))
@@ -318,7 +294,6 @@ You should bind this variable with `let', but do not set it globally.")
(buffer-disable-undo)
(setq truncate-lines t
buffer-read-only t)
- (setq-local font-lock-defaults '(epa-font-lock-keywords t))
(make-local-variable 'epa-exit-buffer-function))
(define-derived-mode epa-info-mode special-mode "EPA Info"
@@ -362,28 +337,12 @@ If ARG is non-nil, mark the key."
;;;; Listing and Selecting
(defun epa--insert-keys (keys)
- (save-excursion
- (save-restriction
- (narrow-to-region (point) (point))
- (let (point)
- (while keys
- (setq point (point))
- (insert " ")
- (add-text-properties point (point)
- (list 'epa-key (car keys)
- 'front-sticky nil
- 'rear-nonsticky t
- 'start-open t
- 'end-open t))
- (widget-create 'epa-key :value (car keys))
- (insert "\n")
- (setq keys (cdr keys))))
- (add-text-properties (point-min) (point-max)
- (list 'epa-list-keys t
- 'front-sticky nil
- 'rear-nonsticky t
- 'start-open t
- 'end-open t)))))
+ (dolist (key keys)
+ (insert
+ (propertize
+ (concat " " (epa--button-key-text key))
+ 'epa-key key))
+ (insert "\n")))
(defun epa--list-keys (name secret &optional doc)
"NAME specifies which key to list.
@@ -420,8 +379,7 @@ DOC is documentation text to insert at the start."
(point-max)))
(goto-char point))
- (epa--insert-keys (epg-list-keys context name secret))
- (widget-setup))
+ (epa--insert-keys (epg-list-keys context name secret)))
(make-local-variable 'epa-list-keys-arguments)
(setq epa-list-keys-arguments (list name secret))
(goto-char (point-min))
@@ -488,20 +446,13 @@ q trust status questionable. - trust status unspecified.
(substitute-command-keys "\
- `\\[epa-mark-key]' to mark a key on the line
- `\\[epa-unmark-key]' to unmark a key on the line\n"))
- (widget-create 'push-button
- :notify (lambda (&rest _ignore) (abort-recursive-edit))
- :help-echo
- "Click here or \\[abort-recursive-edit] to cancel"
- "Cancel")
- (widget-create 'push-button
- :notify (lambda (&rest _ignore) (exit-recursive-edit))
- :help-echo
- "Click here or \\[exit-recursive-edit] to finish"
- "OK")
+ (insert-button "[Cancel]"
+ 'action (lambda (_button) (abort-recursive-edit)))
+ (insert " ")
+ (insert-button "[OK]"
+ 'action (lambda (_button) (exit-recursive-edit)))
(insert "\n\n")
(epa--insert-keys keys)
- (widget-setup)
- (set-keymap-parent (current-local-map) widget-keymap)
(setq epa-exit-buffer-function #'abort-recursive-edit)
(goto-char (point-min))
(let ((display-buffer-mark-dedicated 'soft))
diff --git a/lisp/eshell/em-hist.el b/lisp/eshell/em-hist.el
index 267936583e1..5cee1bad364 100644
--- a/lisp/eshell/em-hist.el
+++ b/lisp/eshell/em-hist.el
@@ -862,7 +862,7 @@ Moves relative to START, or `eshell-history-index'."
(setq prev n
n (mod (+ n motion) len))
;; If we haven't reached a match, step some more.
- (while (and (< n len) (not tried-each-ring-item)
+ (while (and (not tried-each-ring-item)
(not (string-match regexp (eshell-get-history n))))
(setq n (mod (+ n motion) len)
;; If we have gone all the way around in this search.
diff --git a/lisp/ffap.el b/lisp/ffap.el
index 28f566dd93a..af7d84cd099 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -110,8 +110,6 @@
(require 'url-parse)
(require 'thingatpt)
-(define-obsolete-variable-alias 'ffap-version 'emacs-version "23.2")
-
(defgroup ffap nil
"Find file or URL at point."
:group 'matching
diff --git a/lisp/filecache.el b/lisp/filecache.el
index 3c07a494206..113d28cf75e 100644
--- a/lisp/filecache.el
+++ b/lisp/filecache.el
@@ -614,9 +614,6 @@ the name is considered already unique; only the second substitution
(select-window (active-minibuffer-window))
(file-cache-minibuffer-complete nil)))
-(define-obsolete-function-alias 'file-cache-mouse-choose-completion
- #'file-cache-choose-completion "23.2")
-
(defun file-cache-complete ()
"Complete the word at point, using the filecache."
(interactive)
diff --git a/lisp/fileloop.el b/lisp/fileloop.el
index d52e35d886f..458c25a49b0 100644
--- a/lisp/fileloop.el
+++ b/lisp/fileloop.el
@@ -4,18 +4,20 @@
;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/lisp/files.el b/lisp/files.el
index 975f78e8527..ab931048be8 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -5569,10 +5569,28 @@ change the additional actions you can take on files."
t
(setq queried t)
(if (buffer-file-name buffer)
- (format "Save file %s? "
- (buffer-file-name buffer))
- (format "Save buffer %s? "
- (buffer-name buffer))))))
+ (if (or
+ (equal (buffer-name buffer)
+ (file-name-nondirectory
+ (buffer-file-name buffer)))
+ (string-match
+ (concat "\\<"
+ (regexp-quote
+ (file-name-nondirectory
+ buffer-file-name))
+ "<[^>]*>\\'")
+ (buffer-name buffer)))
+ ;; The buffer name is similar to the
+ ;; file name.
+ (format "Save file %s? "
+ (buffer-file-name buffer))
+ ;; The buffer and file names are
+ ;; dissimilar; display both.
+ (format "Save file %s (buffer %s)? "
+ (buffer-file-name buffer)
+ (buffer-name buffer)))
+ ;; No file name
+ (format "Save buffer %s? " (buffer-name buffer))))))
(lambda (buffer)
(with-current-buffer buffer
(save-buffer)))
@@ -5658,25 +5676,28 @@ like `write-region' does."
(defun file-newest-backup (filename)
"Return most recent backup file for FILENAME or nil if no backups exist."
+ (car (file-backup-file-names filename)))
+
+(defun file-backup-file-names (filename)
+ "Return a list of backup files for FILENAME.
+The list will be sorted by modification time so that the most
+recent files are first."
;; `make-backup-file-name' will get us the right directory for
;; ordinary or numeric backups. It might create a directory for
;; backups as a side-effect, according to `backup-directory-alist'.
(let* ((filename (file-name-sans-versions
(make-backup-file-name (expand-file-name filename))))
- (file (file-name-nondirectory filename))
- (dir (file-name-directory filename))
- (comp (file-name-all-completions file dir))
- (newest nil)
- tem)
- (while comp
- (setq tem (pop comp))
- (cond ((and (backup-file-name-p tem)
- (string= (file-name-sans-versions tem) file))
- (setq tem (concat dir tem))
- (if (or (null newest)
- (file-newer-than-file-p tem newest))
- (setq newest tem)))))
- newest))
+ (dir (file-name-directory filename)))
+ (sort
+ (seq-filter
+ (lambda (candidate)
+ (and (backup-file-name-p candidate)
+ (string= (file-name-sans-versions candidate) filename)))
+ (mapcar
+ (lambda (file)
+ (concat dir file))
+ (file-name-all-completions (file-name-nondirectory filename) dir)))
+ #'file-newer-than-file-p)))
(defun rename-uniquely ()
"Rename current buffer to a similar name not already taken.
@@ -5897,9 +5918,9 @@ last-modified time as the old ones. (This works on only some systems.)
A prefix arg makes KEEP-TIME non-nil.
-Noninteractively, the last argument PARENTS says whether to
-create parent directories if they don't exist. Interactively,
-this happens by default.
+Noninteractively, the PARENTS argument says whether to create
+parent directories if they don't exist. Interactively, this
+happens by default.
If NEWNAME is a directory name, copy DIRECTORY as a subdirectory
there. However, if called from Lisp with a non-nil optional
@@ -6465,7 +6486,7 @@ Also rename any existing auto save file, if it was made in this session."
(defun make-auto-save-file-name ()
"Return file name to use for auto-saves of current buffer.
Does not consider `auto-save-visited-file-name' as that variable is checked
-before calling this function. You can redefine this for customization.
+before calling this function.
See also `auto-save-file-name-p'."
(if buffer-file-name
(let ((handler (find-file-name-handler buffer-file-name
@@ -6572,7 +6593,8 @@ See also `auto-save-file-name-p'."
(defun auto-save-file-name-p (filename)
"Return non-nil if FILENAME can be yielded by `make-auto-save-file-name'.
-FILENAME should lack slashes. You can redefine this for customization."
+FILENAME should lack slashes.
+See also `make-auto-save-file-name'."
(string-match "\\`#.*#\\'" filename))
(defun wildcard-to-regexp (wildcard)
@@ -7051,6 +7073,8 @@ normally equivalent short `-D' option is just passed on to
((stringp switches) (concat switches " -d"))
((member "-d" switches) switches)
(t (append switches '("-d"))))))
+ (if (string-match "\\`~" file)
+ (setq file (expand-file-name file)))
(apply 'call-process
insert-directory-program nil t nil
(append
@@ -7061,14 +7085,7 @@ normally equivalent short `-D' option is just passed on to
(split-string-and-unquote switches)))
;; Avoid lossage if FILE starts with `-'.
'("--")
- (progn
- (if (string-match "\\`~" file)
- (setq file (expand-file-name file)))
- (list
- (if full-directory-p
- ;; (concat (file-name-as-directory file) ".")
- file
- file))))))))
+ (list file))))))
;; If we got "//DIRED//" in the output, it means we got a real
;; directory listing, even if `ls' returned nonzero.
diff --git a/lisp/gnus/gnus-dbus.el b/lisp/gnus/gnus-dbus.el
new file mode 100644
index 00000000000..8fbeffba437
--- /dev/null
+++ b/lisp/gnus/gnus-dbus.el
@@ -0,0 +1,70 @@
+;;; gnus-dbus.el --- DBUS integration for Gnus -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2020 Free Software Foundation, Inc.
+
+;; Author: Eric Abrahamsen <eric@ericabrahamsen.net>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This library contains some Gnus integration for systems using DBUS.
+;; At present it registers a signal to close all Gnus servers before
+;; system sleep or hibernation.
+
+;;; Code:
+
+(require 'gnus)
+(require 'dbus)
+(declare-function gnus-close-all-servers "gnus-start")
+
+(defcustom gnus-dbus-close-on-sleep nil
+ "When non-nil, close Gnus servers on system sleep."
+ :group 'gnus-dbus
+ :type 'boolean)
+
+(defvar gnus-dbus-sleep-registration-object nil
+ "Object returned from `dbus-register-signal'.
+Used to unregister the signal.")
+
+(defun gnus-dbus-register-sleep-signal ()
+ "Use `dbus-register-signal' to close servers on sleep."
+ (when (featurep 'dbusbind)
+ (setq gnus-dbus-sleep-registration-object
+ (dbus-register-signal :system
+ "org.freedesktop.login1"
+ "/org/freedesktop/login1"
+ "org.freedesktop.login1.Manager"
+ "PrepareForSleep"
+ #'gnus-dbus-sleep-handler))
+ (gnus-add-shutdown #'gnus-dbus-unregister-sleep-signal 'gnus)))
+
+(defun gnus-dbus-sleep-handler (sleep-start)
+ ;; Sleep-start is t before sleeping.
+ (when (and sleep-start
+ (gnus-alive-p))
+ (condition-case nil
+ (gnus-close-all-servers)
+ (error nil))))
+
+(defun gnus-dbus-unregister-sleep-signal ()
+ (condition-case nil
+ (dbus-unregister-object
+ gnus-dbus-sleep-registration-object)
+ (wrong-type-argument nil)))
+
+(provide 'gnus-dbus)
+;;; gnus-dbus.el ends here
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index 97e10a37a21..d613bc86ad7 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -4300,8 +4300,7 @@ The hook `gnus-suspend-gnus-hook' is called before actually suspending."
;; Closing all the backends is useful (for instance) when when the
;; IP addresses have changed and you need to reconnect.
(dolist (elem gnus-opened-servers)
- (gnus-close-server (car elem))
- (setcar (cdr elem) 'closed))
+ (gnus-close-server (car elem)))
(when group-buf
(bury-buffer group-buf)
(delete-windows-on group-buf t))))
diff --git a/lisp/gnus/gnus-icalendar.el b/lisp/gnus/gnus-icalendar.el
index f13d4dec014..f624b9d032f 100644
--- a/lisp/gnus/gnus-icalendar.el
+++ b/lisp/gnus/gnus-icalendar.el
@@ -5,18 +5,20 @@
;; Author: Jan Tatarik <Jan.Tatarik@gmail.com>
;; Keywords: mail, icalendar, org
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
@@ -148,7 +150,7 @@
("TH" . 4)
("FR" . 5)
("SA" . 6))))
- (when (string-match "BYDAY=\\([^;]+\\)" rrule)
+ (when (and rrule (string-match "BYDAY=\\([^;]+\\)" rrule))
(let ((bydays (split-string (match-string 1 rrule) ",")))
(seq-map
(lambda (x) (cdr (assoc x weekday-map)))
diff --git a/lisp/gnus/gnus-int.el b/lisp/gnus/gnus-int.el
index 60ebc07c343..da385a18023 100644
--- a/lisp/gnus/gnus-int.el
+++ b/lisp/gnus/gnus-int.el
@@ -351,9 +351,12 @@ If it is down, start it up (again)."
"Close the connection to GNUS-COMMAND-METHOD."
(when (stringp gnus-command-method)
(setq gnus-command-method (gnus-server-to-method gnus-command-method)))
- (funcall (gnus-get-function gnus-command-method 'close-server)
- (nth 1 gnus-command-method)
- (nthcdr 2 gnus-command-method)))
+ (prog1
+ (funcall (gnus-get-function gnus-command-method 'close-server)
+ (nth 1 gnus-command-method)
+ (nthcdr 2 gnus-command-method))
+ (when-let ((elem (assoc gnus-command-method gnus-opened-servers)))
+ (setf (nth 1 elem) 'closed))))
(defun gnus-request-list (gnus-command-method)
"Request the active file from GNUS-COMMAND-METHOD."
diff --git a/lisp/gnus/gnus-msg.el b/lisp/gnus/gnus-msg.el
index cdfbf16db5e..e770abc2cdf 100644
--- a/lisp/gnus/gnus-msg.el
+++ b/lisp/gnus/gnus-msg.el
@@ -1598,7 +1598,7 @@ this is a reply."
(message-remove-header "gcc")
(widen)
(setq groups (message-unquote-tokens
- (message-tokenize-header gcc " ,")))
+ (message-tokenize-header gcc " ,\n\t")))
;; Copy the article over to some group(s).
(while (setq group (pop groups))
(setq method (gnus-inews-group-method group)
diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el
index ba8b91be5c5..fe600f107ce 100644
--- a/lisp/gnus/gnus-start.el
+++ b/lisp/gnus/gnus-start.el
@@ -31,6 +31,7 @@
(require 'gnus-range)
(require 'gnus-util)
(require 'gnus-cloud)
+(require 'gnus-dbus)
(autoload 'message-make-date "message")
(autoload 'gnus-agent-read-servers-validate "gnus-agent")
(autoload 'gnus-agent-save-local "gnus-agent")
@@ -798,6 +799,8 @@ prompt the user for the name of an NNTP server to use."
(gnus-run-hooks 'gnus-setup-news-hook)
(when gnus-agent
(gnus-request-create-group "queue" '(nndraft "")))
+ (when gnus-dbus-close-on-sleep
+ (gnus-dbus-register-sleep-signal))
(gnus-start-draft-setup)
;; Generate the group buffer.
(gnus-group-list-groups level)
diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el
index b41609406c3..ebf2d72e6e8 100644
--- a/lisp/gnus/gnus.el
+++ b/lisp/gnus/gnus.el
@@ -292,6 +292,10 @@ is restarted, and sometimes reloaded."
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
+(defgroup gnus-dbus nil
+ "D-Bus integration for Gnus."
+ :group 'gnus)
+
(defconst gnus-version-number "5.13"
"Version number for this version of Gnus.")
diff --git a/lisp/gnus/mml.el b/lisp/gnus/mml.el
index ef8aa6ac019..067396fc2a6 100644
--- a/lisp/gnus/mml.el
+++ b/lisp/gnus/mml.el
@@ -1360,7 +1360,7 @@ If not set, `default-directory' will be used."
(value (pop plist)))
(when value
;; Quote VALUE if it contains suspicious characters.
- (when (string-match "[\"'\\~/*;() \t\n[:multibyte:]]" value)
+ (when (string-match "[][\"'\\~/*;()<>= \t\n[:multibyte:]]" value)
(setq value (with-output-to-string
(let (print-escape-nonascii)
(prin1 value)))))
diff --git a/lisp/help-at-pt.el b/lisp/help-at-pt.el
index e184c782640..1d9e051a8cf 100644
--- a/lisp/help-at-pt.el
+++ b/lisp/help-at-pt.el
@@ -92,13 +92,16 @@ the `kbd-help' property at point. If `kbd-help' does not produce
a string, but the `help-echo' property does, then that string is
printed instead.
+The string is passed through `substitute-command-keys' before it
+is displayed.
+
A numeric argument ARG prevents display of a message in case
there is no help. While ARG can be used interactively, it is
mainly meant for use from Lisp."
(interactive "P")
(let ((help (help-at-pt-kbd-string)))
(if help
- (message "%s" help)
+ (message "%s" (substitute-command-keys help))
(if (not arg) (message "No local help at point")))))
(defvar help-at-pt-timer nil
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index 49cdb4ed5e4..a5241f2ed4d 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -152,7 +152,7 @@ When called from lisp, FUNCTION may also be a function object."
(enable-recursive-minibuffers t)
(val (completing-read
(if fn
- (format "Describe function (default %s): " fn)
+ (format-prompt "Describe function" fn)
"Describe function: ")
#'help--symbol-completion-table
(lambda (f) (or (fboundp f) (get f 'function-documentation)))
diff --git a/lisp/help.el b/lisp/help.el
index b7d867eb70e..1b0149616f2 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -131,7 +131,6 @@ This is a list
(WINDOW . quit-window) do quit-window, then select WINDOW.
(WINDOW BUF START POINT) display BUF at START, POINT, then select WINDOW.")
-(define-obsolete-function-alias 'print-help-return-message 'help-print-return-message "23.2")
(defun help-print-return-message (&optional function)
"Display or return message saying how to restore windows after help command.
This function assumes that `standard-output' is the help buffer.
diff --git a/lisp/image-mode.el b/lisp/image-mode.el
index 4c719f7cda2..032ebf38733 100644
--- a/lisp/image-mode.el
+++ b/lisp/image-mode.el
@@ -718,7 +718,7 @@ A non-mage major mode found from `auto-mode-alist' or fundamental mode
displays an image file as text."
;; image-mode-as-text = normal-mode + image-minor-mode
(let ((previous-image-type image-type)) ; preserve `image-type'
- (major-mode-restore '(image-mode image-mode-maybe image-mode-as-text))
+ (major-mode-restore '(image-mode image-mode-as-text))
;; Restore `image-type' after `kill-all-local-variables' in `normal-mode'.
(setq image-type previous-image-type)
;; Enable image minor mode with `C-c C-c'.
@@ -768,8 +768,6 @@ on these modes."
(if (image-get-display-property)
"text" "an image or hex") ".")))
-(define-obsolete-function-alias 'image-mode-maybe 'image-mode "23.2")
-
(defun image-toggle-display-text ()
"Show the image file as text.
Remove text properties that display the image."
diff --git a/lisp/imenu.el b/lisp/imenu.el
index 1949f2f48f7..3a16dcb9ac3 100644
--- a/lisp/imenu.el
+++ b/lisp/imenu.el
@@ -316,28 +316,6 @@ PREVPOS is the variable in which we store the last position displayed."
)
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;;
-;;;; Some examples of functions utilizing the framework of this
-;;;; package.
-;;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;; FIXME: This was the only imenu-example-* definition actually used,
-;; by cperl-mode.el. Now cperl-mode has its own copy, so these can
-;; all be removed.
-(defun imenu-example--name-and-position ()
- "Return the current/previous sexp and its (beginning) location.
-Don't move point."
- (declare (obsolete "use your own function instead." "23.2"))
- (save-excursion
- (forward-sexp -1)
- ;; [ydi] modified for imenu-use-markers
- (let ((beg (if imenu-use-markers (point-marker) (point)))
- (end (progn (forward-sexp) (point))))
- (cons (buffer-substring beg end)
- beg))))
-
;;;
;;; Lisp
;;;
diff --git a/lisp/info.el b/lisp/info.el
index 78f88947c79..ab678c26b62 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -2308,7 +2308,11 @@ If SAME-FILE is non-nil, do not move to a different Info file."
nil t))
(progn (beginning-of-line) (if (looking-at "^\\* ") (forward-char 2)))
(goto-char p)
- (Info-restore-point Info-history)))))
+ (Info-restore-point Info-history))))
+ ;; If scroll-conservatively is non-zero and less than 101, display
+ ;; as much of the superior node above the target line as possible.
+ (when (< 0 scroll-conservatively 101)
+ (recenter)))
(defun Info-history-back ()
"Go back in the history to the last node visited."
@@ -2771,6 +2775,8 @@ Because of ambiguities, this should be concatenated with something like
;; Go back to the start node (for the next completion).
(unless (equal Info-current-node orignode)
(Info-goto-node orignode))
+ ;; Arrange list to be in order found in node.
+ (setq completions (nreverse completions))
;; Update the cache.
(setq Info-complete-cache
(list Info-current-file Info-current-node
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index 5fe931dd9bb..02dacaf0a28 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -2070,12 +2070,6 @@ See `set-language-info-alist' for use in programs."
"Do various unibyte-mode setups for language environment LANGUAGE-NAME."
(set-display-table-and-terminal-coding-system language-name))
-(defun princ-list (&rest args)
- "Print all arguments with `princ', then print \"\\n\"."
- (declare (obsolete "use mapc and princ instead." "23.3"))
- (mapc #'princ args)
- (princ "\n"))
-
(put 'describe-specified-language-support 'apropos-inhibit t)
;; Print language-specific information such as input methods,
diff --git a/lisp/jsonrpc.el b/lisp/jsonrpc.el
index ff8f250a22e..2d50df70fd4 100644
--- a/lisp/jsonrpc.el
+++ b/lisp/jsonrpc.el
@@ -329,7 +329,10 @@ ignored."
:method method
:params params))
-(defconst jrpc-default-request-timeout 10
+(define-obsolete-variable-alias 'jrpc-default-request-timeout
+ 'jsonrpc-default-request-timeout "28.1")
+
+(defconst jsonrpc-default-request-timeout 10
"Time in seconds before timing out a JSONRPC request.")
@@ -617,7 +620,7 @@ With optional CLEANUP, kill any associated buffers."
params
&rest args
&key success-fn error-fn timeout-fn
- (timeout jrpc-default-request-timeout)
+ (timeout jsonrpc-default-request-timeout)
(deferred nil))
"Does actual work for `jsonrpc-async-request'.
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index 312baffb901..f14025a93a8 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -417,20 +417,6 @@ The variable `rmail-highlighted-headers' specifies which headers."
:group 'rmail-headers
:version "22.1")
-;; This was removed in Emacs 23.1 with no notification, an unnecessary
-;; incompatible change.
-(defcustom rmail-highlight-face 'rmail-highlight
- "Face used by Rmail for highlighting headers."
- ;; Note that nil doesn't actually mean use the default face, it
- ;; means use either bold or highlight. It's not worth fixing this
- ;; now that this is obsolete.
- :type '(choice (const :tag "Default" nil)
- face)
- :group 'rmail-headers)
-(make-obsolete-variable 'rmail-highlight-face
- "customize the face `rmail-highlight' instead."
- "23.2")
-
(defface rmail-header-name
'((t (:inherit font-lock-function-name-face)))
"Face to use for highlighting the header names.
@@ -3012,7 +2998,7 @@ using the coding system CODING."
(defun rmail-highlight-headers ()
"Highlight the headers specified by `rmail-highlighted-headers'.
-Uses the face specified by `rmail-highlight-face'."
+Uses the face `rmail-highlight'."
(if rmail-highlighted-headers
(save-excursion
(search-forward "\n\n" nil 'move)
@@ -3020,11 +3006,7 @@ Uses the face specified by `rmail-highlight-face'."
(narrow-to-region (point-min) (point))
(let ((case-fold-search t)
(inhibit-read-only t)
- ;; When rmail-highlight-face is removed, just
- ;; use 'rmail-highlight here.
- (face (or rmail-highlight-face
- (if (face-differs-from-default-p 'bold)
- 'bold 'highlight)))
+ (face 'rmail-highlight)
;; List of overlays to reuse.
(overlays rmail-overlay-list))
(goto-char (point-min))
diff --git a/lisp/mail/smtpmail.el b/lisp/mail/smtpmail.el
index 666395e0b9e..1786608dd67 100644
--- a/lisp/mail/smtpmail.el
+++ b/lisp/mail/smtpmail.el
@@ -512,8 +512,9 @@ for `smtpmail-try-auth-method'.")
(if port
(format "%s" port)
"smtp"))
- (let* ((mechs (cdr-safe (assoc 'auth supported-extensions)))
- (mech (car (smtpmail-intersection mechs smtpmail-auth-supported)))
+ (let* ((mechs (smtpmail-intersection
+ (cdr-safe (assoc 'auth supported-extensions))
+ smtpmail-auth-supported))
(auth-source-creation-prompts
'((user . "SMTP user name for %h: ")
(secret . "SMTP password for %u@%h: ")))
@@ -526,6 +527,7 @@ for `smtpmail-try-auth-method'.")
:require (and ask-for-password
'(:user :secret))
:create ask-for-password)))
+ (mech (or (plist-get auth-info :smtp-auth) (car mechs)))
(user (plist-get auth-info :user))
(password (plist-get auth-info :secret))
(save-function (and ask-for-password
diff --git a/lisp/minibuf-eldef.el b/lisp/minibuf-eldef.el
index 01672c027f0..a32d21abb30 100644
--- a/lisp/minibuf-eldef.el
+++ b/lisp/minibuf-eldef.el
@@ -36,10 +36,24 @@
(defvar minibuffer-eldef-shorten-default)
(defun minibuffer-default--in-prompt-regexps ()
- `(("\\( (default\\(?: is\\)? \\(.*\\))\\):? \\'"
- 1 ,(if minibuffer-eldef-shorten-default " [\\2]"))
- ("([^(]+?\\(, default\\(?: is\\)? \\(.*\\)\\)):? \\'" 1)
- ("\\( \\[.*\\]\\):? *\\'" 1)))
+ (cons
+ (list
+ (concat
+ "\\("
+ (if (string-match "%s" minibuffer-default-prompt-format)
+ (concat
+ (regexp-quote (substring minibuffer-default-prompt-format
+ 0 (match-beginning 0)))
+ ".*"
+ (regexp-quote (substring minibuffer-default-prompt-format
+ (match-end 0))))
+ (regexp-quote minibuffer-default-prompt-format))
+ ": *\\)")
+ 1)
+ `(("\\( (default\\(?: is\\)? \\(.*\\))\\):? \\'"
+ 1 ,(if minibuffer-eldef-shorten-default " [\\2]"))
+ ("([^(]+?\\(, default\\(?: is\\)? \\(.*\\)\\)):? \\'" 1)
+ ("\\( \\[.*\\]\\):? *\\'" 1))))
(defcustom minibuffer-eldef-shorten-default nil
"If non-nil, shorten \"(default ...)\" to \"[...]\" in minibuffer prompts."
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 641a2e53152..47f28d0010c 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -2539,11 +2539,6 @@ same as `substitute-in-file-name'."
all))))))
(file-error nil))) ;PCM often calls with invalid directories.
-(defvar read-file-name-predicate nil
- "Current predicate used by `read-file-name-internal'.")
-(make-obsolete-variable 'read-file-name-predicate
- "use the regular PRED argument" "23.2")
-
(defun completion--sifn-requote (upos qstr)
;; We're looking for `qpos' such that:
;; (equal (substring (substitute-in-file-name qstr) 0 upos)
@@ -3033,6 +3028,19 @@ the commands start with a \"-\" or a SPC."
:version "24.1"
:type 'boolean)
+(defcustom minibuffer-default-prompt-format " (default %s)"
+ "Format string used to output \"default\" values.
+When prompting for input, there will often be a default value,
+leading to prompts like \"Number of articles (default 50): \".
+The \"default\" part of that prompt is controlled by this
+variable, and can be set to, for instance, \" [%s]\" if you want
+a shorter displayed prompt, or \"\", if you don't want to display
+the default at all.
+
+This variable is used by the `format-prompt' function."
+ :version "28.1"
+ :type 'string)
+
(defun completion-pcm--pattern-trivial-p (pattern)
(and (stringp (car pattern))
;; It can be followed by `point' and "" and still be trivial.
@@ -3850,6 +3858,19 @@ the minibuffer was activated, and execute the forms."
(with-minibuffer-selected-window
(scroll-other-window-down arg)))
+(defun format-prompt (prompt default &rest format-args)
+ "Format PROMPT with DEFAULT according to `minibuffer-default-prompt-format'.
+If FORMAT-ARGS is nil, PROMPT is used as a plain string. If
+FORMAT-ARGS is non-nil, PROMPT is used as a format control
+string, and FORMAT-ARGS are the arguments to be substituted into
+it. See `format' for details."
+ (concat
+ (if (null format-args)
+ prompt
+ (apply #'format prompt format-args))
+ (format minibuffer-default-prompt-format default)
+ ": "))
+
(provide 'minibuffer)
;;; minibuffer.el ends here
diff --git a/lisp/mouse.el b/lisp/mouse.el
index a06ca2a56ca..06fdca12b9c 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -2303,9 +2303,6 @@ and selects that window."
;; Few buffers--put them all in one pane.
(list (cons title alist))))
-(define-obsolete-function-alias
- 'mouse-choose-completion 'choose-completion "23.2")
-
;; Font selection.
(defun font-menu-add-default ()
diff --git a/lisp/mwheel.el b/lisp/mwheel.el
index c385fdfc265..d5172ba0bf5 100644
--- a/lisp/mwheel.el
+++ b/lisp/mwheel.el
@@ -25,8 +25,8 @@
;; Under X11/X.Org, the wheel events are sent as button4/button5
;; events.
-;; It is already enabled by default on most graphical displays. You
-;; can toggle it with M-x mouse-wheel-mode.
+;; Mouse wheel support is already enabled by default on most graphical
+;; displays. You can toggle it using `M-x mouse-wheel-mode'.
;;; Code:
diff --git a/lisp/net/shr.el b/lisp/net/shr.el
index ddd81127213..8fdc7580320 100644
--- a/lisp/net/shr.el
+++ b/lisp/net/shr.el
@@ -1209,25 +1209,8 @@ Return a string with image data."
;; that are non-ASCII.
(shr-dom-to-xml
(libxml-parse-xml-region (point) (point-max)) 'utf-8)))
- ;; SVG images often do not have a specified foreground/background
- ;; color, so wrap them in styles.
- (when (and (display-images-p)
- (eq content-type 'image/svg+xml))
- (setq data (svg--wrap-svg data)))
(list data content-type)))
-(defun svg--wrap-svg (data)
- "Add a default foreground colour to SVG images."
- (let ((size (image-size (create-image data nil t :scaling 1) t)))
- (with-temp-buffer
- (insert
- (format
- "<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xi=\"http://www.w3.org/2001/XInclude\" style=\"color: %s;\" viewBox=\"0 0 %d %d\"> <xi:include href=\"data:image/svg+xml;base64,%s\"></xi:include></svg>"
- (face-foreground 'default)
- (car size) (cdr size)
- (base64-encode-string data t)))
- (buffer-string))))
-
(defun shr-image-displayer (content-function)
"Return a function to display an image.
CONTENT-FUNCTION is a function to retrieve an image for a cid url that
@@ -1332,7 +1315,7 @@ ones, in case fg and bg are nil."
t))
(when bg
(add-face-text-property start end
- (list :background (car new-colors))
+ (list :background (car new-colors) :extend t)
t)))
new-colors)))
@@ -2267,7 +2250,7 @@ flags that control whether to collect or render objects."
(not background))
(setq background (cadr elem))))
(and background
- (list :background background))))))
+ (list :background background :extend t))))))
(defun shr-expand-alignments (start end)
(while (< (setq start (next-single-property-change
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index fae15fe6a8e..7a3f3fe8f02 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -3025,6 +3025,10 @@ implementation will be used."
(setq signals
(append
'(0) (split-string (shell-command-to-string "kill -l") nil 'omit)))
+ ;; Sanity check. Sometimes, the first entry is "0", although we
+ ;; don't expect it. Remove it.
+ (when (and (stringp (cadr signals)) (string-equal "0" (cadr signals)))
+ (setcdr signals (cddr signals)))
;; Sanity check. "kill -l" shall have returned just the signal
;; names. Some shells don't, like the one in "docker alpine".
(let (signal-hook-function)
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 83ade66ee14..28067faba30 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -248,6 +248,10 @@ pair of the form (KEY VALUE). The following KEYs are defined:
parameters to suppress diagnostic messages, in order not to
tamper the process output.
+ * `tramp-direct-async-args'
+ An additional argument when a direct asynchronous process is
+ started. Used so far only in the \"mock\" method of tramp-tests.el.
+
* `tramp-copy-program'
This specifies the name of the program to use for remotely copying
the file; this might be the absolute filename of scp or the name of
@@ -3733,26 +3737,29 @@ User is always nil."
(defun tramp-direct-async-process-p (&rest args)
"Whether direct async `make-process' can be called."
- (let ((v (tramp-dissect-file-name default-directory)))
- (and (tramp-get-connection-property v "direct-async-process" nil)
- (= (length (tramp-compute-multi-hops v)) 1)
- (not (plist-get args :stderr)))))
-
-;; We use BUFFER also as connection buffer during setup. Because of
-;; this, its original contents must be saved, and restored once
-;; connection has been setup.
+ (let ((v (tramp-dissect-file-name default-directory))
+ (buffer (plist-get args :buffer))
+ (stderr (plist-get args :stderr)))
+ (and ;; It has been indicated.
+ (tramp-get-connection-property v "direct-async-process" nil)
+ ;; There's no multi-hop.
+ (or (not (tramp-multi-hop-p v))
+ (= (length (tramp-compute-multi-hops v)) 1))
+ ;; There's no remote stdout or stderr file.
+ (or (not (stringp buffer)) (not (tramp-tramp-file-p buffer)))
+ (or (not (stringp stderr)) (not (tramp-tramp-file-p stderr))))))
+
(defun tramp-handle-make-process (&rest args)
"An alternative `make-process' implementation for Tramp files.
It does not support `:stderr'."
(when args
(with-parsed-tramp-file-name (expand-file-name default-directory) nil
- (let ((name (plist-get args :name))
+ (let ((default-directory (tramp-compat-temporary-file-directory))
+ (name (plist-get args :name))
(buffer (plist-get args :buffer))
(command (plist-get args :command))
- ;; FIXME: `:coding' shall be used.
(coding (plist-get args :coding))
(noquery (plist-get args :noquery))
- ;; FIXME: `:connection-type' shall be used.
(connection-type (plist-get args :connection-type))
(filter (plist-get args :filter))
(sentinel (plist-get args :sentinel))
@@ -3775,122 +3782,77 @@ It does not support `:stderr'."
(signal 'wrong-type-argument (list #'functionp filter)))
(unless (or (null sentinel) (functionp sentinel))
(signal 'wrong-type-argument (list #'functionp sentinel)))
- (when stderr
- (signal
- 'user-error
- (list
- "Stderr not supported for direct remote asynchronous processes"
- stderr)))
+ (unless (or (null stderr) (bufferp stderr))
+ (signal 'wrong-type-argument (list #'stringp stderr)))
(let* ((buffer
(if buffer
(get-buffer-create buffer)
;; BUFFER can be nil. We use a temporary buffer.
(generate-new-buffer tramp-temp-buffer-name)))
- (command (append `("cd" ,localname "&&")
- (mapcar #'tramp-shell-quote-argument command)))
- (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer)))
- (name1 name)
- (i 0)
- ;; We do not want to raise an error when `make-process'
- ;; has been started several times in `eshell' and
- ;; friends.
- tramp-current-connection
- p)
-
- (while (get-process name1)
- ;; NAME must be unique as process name.
- (setq i (1+ i)
- name1 (format "%s<%d>" name i)))
- (setq name name1)
- ;; Set the new process properties.
- (tramp-set-connection-property v "process-name" name)
- (tramp-set-connection-property v "process-buffer" buffer)
+ (command
+ (mapconcat
+ #'identity (append `("cd" ,localname "&&") command) " ")))
;; Check for `tramp-sh-file-name-handler', because something
;; is different between tramp-adb.el and tramp-sh.el.
- (with-current-buffer (tramp-get-connection-buffer v)
- (unwind-protect
- (let* ((sh-file-name-handler-p (tramp-sh-file-name-handler-p v))
- (login-program
- (tramp-get-method-parameter v 'tramp-login-program))
- (login-args
- (tramp-get-method-parameter v 'tramp-login-args))
- (async-args
- (tramp-get-method-parameter v 'tramp-async-args))
- ;; We don't create the temporary file. In
- ;; fact, it is just a prefix for the
- ;; ControlPath option of ssh; the real
- ;; temporary file has another name, and it is
- ;; created and protected by ssh. It is also
- ;; removed by ssh when the connection is
- ;; closed. The temporary file name is cached
- ;; in the main connection process, therefore
- ;; we cannot use `tramp-get-connection-process'.
- (tmpfile
- (when sh-file-name-handler-p
- (with-tramp-connection-property
- (tramp-get-process v) "temp-file"
- (tramp-compat-make-temp-name))))
- (options
- (when sh-file-name-handler-p
- (tramp-compat-funcall
- 'tramp-ssh-controlmaster-options v)))
- spec)
-
- ;; Replace `login-args' place holders.
- (setq
- spec (format-spec-make ?t tmpfile)
- options (format-spec (or options "") spec)
- spec (format-spec-make
- ?h (or host "") ?u (or user "") ?p (or port "")
- ?c options ?l "")
- ;; Add arguments for asynchronous processes.
- login-args (append async-args login-args)
- ;; Expand format spec.
- login-args
- (tramp-compat-flatten-tree
- (mapcar
- (lambda (x)
- (setq x (mapcar (lambda (y) (format-spec y spec)) x))
- (unless (member "" x) x))
- login-args))
- ;; Split ControlMaster options.
- login-args
- (tramp-compat-flatten-tree
- (mapcar (lambda (x) (split-string x " ")) login-args))
- p (apply
- #'start-process
- name buffer login-program (append login-args command)))
-
- (tramp-message v 6 "%s" (string-join (process-command p) " "))
- ;; Set sentinel and filter.
- (when sentinel
- (set-process-sentinel p sentinel))
- (when filter
- (set-process-filter p filter))
- ;; Set query flag and process marker for this
- ;; process. We ignore errors, because the
- ;; process could have finished already.
- (ignore-errors
- (set-process-query-on-exit-flag p (null noquery))
- (set-marker (process-mark p) (point)))
- ;; We must flush them here already; otherwise
- ;; `rename-file', `delete-file' or
- ;; `insert-file-contents' will fail.
- (tramp-flush-connection-property v "process-name")
- (tramp-flush-connection-property v "process-buffer")
- ;; Return process.
- p)
-
- ;; Save exit.
- (if (string-match-p tramp-temp-buffer-name (buffer-name))
- (ignore-errors
- (set-process-buffer p nil)
- (kill-buffer (current-buffer)))
- (set-buffer-modified-p bmp))
- (tramp-flush-connection-property v "process-name")
- (tramp-flush-connection-property v "process-buffer"))))))))
+ (let* ((sh-file-name-handler-p (tramp-sh-file-name-handler-p v))
+ (login-program
+ (tramp-get-method-parameter v 'tramp-login-program))
+ (login-args
+ (tramp-get-method-parameter v 'tramp-login-args))
+ (async-args
+ (tramp-get-method-parameter v 'tramp-async-args))
+ (direct-async-args
+ (tramp-get-method-parameter v 'tramp-direct-async-args))
+ ;; We don't create the temporary file. In fact, it
+ ;; is just a prefix for the ControlPath option of
+ ;; ssh; the real temporary file has another name, and
+ ;; it is created and protected by ssh. It is also
+ ;; removed by ssh when the connection is closed. The
+ ;; temporary file name is cached in the main
+ ;; connection process, therefore we cannot use
+ ;; `tramp-get-connection-process'.
+ (tmpfile
+ (when sh-file-name-handler-p
+ (with-tramp-connection-property
+ (tramp-get-process v) "temp-file"
+ (tramp-compat-make-temp-name))))
+ (options
+ (when sh-file-name-handler-p
+ (tramp-compat-funcall
+ 'tramp-ssh-controlmaster-options v)))
+ spec p)
+
+ ;; Replace `login-args' place holders.
+ (setq
+ spec (format-spec-make ?t tmpfile)
+ options (format-spec (or options "") spec)
+ spec (format-spec-make
+ ?h (or host "") ?u (or user "") ?p (or port "")
+ ?c options ?l "")
+ ;; Add arguments for asynchronous processes.
+ login-args (append async-args direct-async-args login-args)
+ ;; Expand format spec.
+ login-args
+ (tramp-compat-flatten-tree
+ (mapcar
+ (lambda (x)
+ (setq x (mapcar (lambda (y) (format-spec y spec)) x))
+ (unless (member "" x) x))
+ login-args))
+ ;; Split ControlMaster options.
+ login-args
+ (tramp-compat-flatten-tree
+ (mapcar (lambda (x) (split-string x " ")) login-args))
+ p (make-process
+ :name name :buffer buffer
+ :command (append `(,login-program) login-args `(,command))
+ :coding coding :noquery noquery :connection-type connection-type
+ :filter filter :sentinel sentinel :stderr stderr))
+
+ (tramp-message v 6 "%s" (string-join (process-command p) " "))
+ p))))))
(defun tramp-handle-make-symbolic-link
(target linkname &optional ok-if-already-exists)
diff --git a/lisp/progmodes/antlr-mode.el b/lisp/progmodes/antlr-mode.el
index bf56a7ee49e..24e1f8831a0 100644
--- a/lisp/progmodes/antlr-mode.el
+++ b/lisp/progmodes/antlr-mode.el
@@ -695,7 +695,7 @@ imenu."
(define-key map "\e\C-e" 'antlr-end-of-rule)
(define-key map "\C-c\C-a" 'antlr-beginning-of-body)
(define-key map "\C-c\C-e" 'antlr-end-of-body)
- (define-key map "\C-c\C-f" 'c-forward-into-nomenclature)
+ (define-key map "\C-c\C-f" 'subword-forward)
(define-key map "\C-c\C-b" 'c-backward-into-nomenclature)
(define-key map "\C-c\C-c" 'comment-region)
(define-key map "\C-c\C-v" 'antlr-hide-actions)
@@ -745,7 +745,7 @@ imenu."
["Backward Statement" c-beginning-of-statement t]
["Forward Statement" c-end-of-statement t]
["Backward Into Nomencl." c-backward-into-nomenclature t]
- ["Forward Into Nomencl." c-forward-into-nomenclature t])
+ ["Forward Into Nomencl." subword-forward t])
["Indent Region" indent-region
:active (and (not buffer-read-only) (c-region-is-active-p))]
["Comment Out Region" comment-region
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el
index 1b557c41a5d..4425e275ac9 100644
--- a/lisp/progmodes/cc-cmds.el
+++ b/lisp/progmodes/cc-cmds.el
@@ -1554,19 +1554,6 @@ left out."
(declare-function c-backward-subword "ext:cc-subword" (&optional arg))
;; "nomenclature" functions + c-scope-operator.
-(defun c-forward-into-nomenclature (&optional arg)
- "Compatibility alias for `c-forward-subword'."
- (interactive "p")
- (if (fboundp 'subword-mode)
- (progn
- (require 'subword)
- (subword-forward arg))
- (require 'cc-subword)
- (c-forward-subword arg)))
-(make-obsolete 'c-forward-into-nomenclature
- (if (fboundp 'subword-mode) 'subword-forward 'c-forward-subword)
- "23.2")
-
(defun c-backward-into-nomenclature (&optional arg)
"Compatibility alias for `c-backward-subword'."
(interactive "p")
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index a043bbcfa3c..731db0fd6db 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -221,9 +221,9 @@ of[ \t]+\"?\\([a-zA-Z]?:?[^\":\n]+\\)\"?:" 3 2 nil (1))
;; considered before EDG.
;; The message may be a "warning", "error", or "fatal error" with
;; an error code, or "see declaration of" without an error code.
- "^ *\\([0-9]+>\\)?\\(\\(?:[a-zA-Z]:\\)?[^ :(\t\n][^:(\t\n]*\\)(\\([0-9]+\\)) ?\
+ "^ *\\([0-9]+>\\)?\\(\\(?:[a-zA-Z]:\\)?[^ :(\t\n][^:(\t\n]*\\)(\\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)?) ?\
: \\(?:see declaration\\|\\(?:warnin\\(g\\)\\|[a-z ]+\\) C[0-9]+:\\)"
- 2 3 nil (4))
+ 2 3 4 (5))
(edg-1
"^\\([^ \n]+\\)(\\([0-9]+\\)): \\(?:error\\|warnin\\(g\\)\\|remar\\(k\\)\\)"
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index c47aa2ea8c2..44579cfd386 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -4876,7 +4876,7 @@ Returns some position at the last line."
;; }? continue
;; blah; }
(if (not
- (or (looking-at "[ \t]*\\(els\\(e\\|if\\)\\|continue\\|if\\|while\\|for\\(each\\)?\\|until\\)")
+ (or (looking-at "[ \t]*\\(els\\(e\\|if\\)\\|continue\\|if\\|while\\|for\\(each\\)?\\|unless\\|until\\)\\_>")
(setq have-brace (save-excursion (search-forward "}" ee t)))))
nil ; Do not need to do anything
;; Looking at:
@@ -4884,7 +4884,7 @@ Returns some position at the last line."
;; else
(if cperl-merge-trailing-else
(if (looking-at
- "[ \t]*}[ \t]*\n[ \t\n]*\\(els\\(e\\|if\\)\\|continue\\)\\>")
+ "[ \t]*}[ \t]*\n[ \t\n]*\\(els\\(e\\|if\\)\\|continue\\)\\_>")
(progn
(search-forward "}")
(setq p (point))
@@ -4892,7 +4892,7 @@ Returns some position at the last line."
(delete-region p (point))
(insert (make-string cperl-indent-region-fix-constructs ?\s))
(beginning-of-line)))
- (if (looking-at "[ \t]*}[ \t]*\\(els\\(e\\|if\\)\\|continue\\)\\>")
+ (if (looking-at "[ \t]*}[ \t]*\\(els\\(e\\|if\\)\\|continue\\)\\_>")
(save-excursion
(search-forward "}")
(delete-horizontal-space)
@@ -4904,7 +4904,7 @@ Returns some position at the last line."
(setq ret (point)))))))
;; Looking at:
;; } else
- (if (looking-at "[ \t]*}\\(\t*\\|[ \t][ \t]+\\)\\<\\(els\\(e\\|if\\)\\|continue\\)\\>")
+ (if (looking-at "[ \t]*}\\(\t*\\|[ \t][ \t]+\\)\\<\\(els\\(e\\|if\\)\\|continue\\)\\_>")
(progn
(search-forward "}")
(delete-horizontal-space)
diff --git a/lisp/progmodes/flymake-cc.el b/lisp/progmodes/flymake-cc.el
index bddd1a39fc2..19565ef9b13 100644
--- a/lisp/progmodes/flymake-cc.el
+++ b/lisp/progmodes/flymake-cc.el
@@ -5,18 +5,20 @@
;; Author: João Távora <joaotavora@gmail.com>
;; Keywords: languages, c
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/lisp/progmodes/hideshow.el b/lisp/progmodes/hideshow.el
index c5b9cfc2e7b..625e08e4d79 100644
--- a/lisp/progmodes/hideshow.el
+++ b/lisp/progmodes/hideshow.el
@@ -225,8 +225,6 @@
;;---------------------------------------------------------------------------
;; user-configurable variables
-(require 'cl-lib)
-
(defgroup hideshow nil
"Minor mode for hiding and showing program and comment blocks."
:prefix "hs-"
@@ -654,9 +652,7 @@ Otherwise, guess start, end and `comment-start' regexps; `forward-sexp'
function; and adjust-block-beginning function."
(if (and (bound-and-true-p comment-start)
(bound-and-true-p comment-end))
- (let* ((lookup (cl-assoc-if (lambda (mode)
- (derived-mode-p major-mode mode))
- hs-special-modes-alist))
+ (let* ((lookup (assoc major-mode hs-special-modes-alist))
(start-elem (or (nth 1 lookup) "\\s(")))
(if (listp start-elem)
;; handle (START-REGEXP MDATA-SELECT)
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index 153f2578bf1..90e56943f20 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -7042,12 +7042,10 @@ If these don't exist, a letter in the string is automatically selected."
#'idlwave-make-modified-completion-map "28.1")
(defun idlwave-make-modified-completion-map (old-map)
- "Replace `choose-completion' and `mouse-choose-completion' in OLD-MAP."
+ "Replace `choose-completion' in OLD-MAP."
(let ((new-map (copy-keymap old-map)))
(substitute-key-definition
'choose-completion 'idlwave-choose-completion new-map)
- (substitute-key-definition
- 'mouse-choose-completion 'idlwave-mouse-choose-completion new-map)
(define-key new-map [mouse-3] 'idlwave-mouse-completion-help)
new-map))
@@ -7056,10 +7054,8 @@ If these don't exist, a letter in the string is automatically selected."
(interactive (list last-nonmenu-event))
(apply 'idlwave-choose 'choose-completion args))
-(defun idlwave-mouse-choose-completion (&rest args)
- "Click on an alternative in the `*Completions*' buffer to choose it."
- (interactive "e")
- (apply 'idlwave-choose 'mouse-choose-completion args))
+(define-obsolete-function-alias 'idlwave-mouse-choose-completion
+ #'idlwave-choose-completion "28.1")
;;----------------------------------------------------------------------
;;----------------------------------------------------------------------
diff --git a/lisp/progmodes/make-mode.el b/lisp/progmodes/make-mode.el
index ec246d63ac2..235279e226e 100644
--- a/lisp/progmodes/make-mode.el
+++ b/lisp/progmodes/make-mode.el
@@ -316,7 +316,7 @@ not be enclosed in { } or ( )."
(defconst makefile-gmake-statements
`("-sinclude" "sinclude" ; makefile-makepp-statements takes rest
"ifdef" "ifndef" "ifeq" "ifneq" "-include" "define" "endef" "export"
- "override define" "override" "unexport" "vpath"
+ "override define" "override" "unexport" "vpath" "undefine"
,@(cdr makefile-automake-statements))
"List of keywords understood by gmake.")
diff --git a/lisp/progmodes/octave.el b/lisp/progmodes/octave.el
index e07f818a68a..3dd9b8dae6a 100644
--- a/lisp/progmodes/octave.el
+++ b/lisp/progmodes/octave.el
@@ -165,7 +165,7 @@ parenthetical grouping.")
(modify-syntax-entry ?| "." table)
(modify-syntax-entry ?! "." table)
(modify-syntax-entry ?\\ "." table)
- (modify-syntax-entry ?\' "." table)
+ (modify-syntax-entry ?\' "\"" table)
(modify-syntax-entry ?\` "." table)
(modify-syntax-entry ?. "." table)
(modify-syntax-entry ?\" "\"" table)
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 8afd5ce7959..4fae3e9186c 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -581,6 +581,8 @@ DIRS must contain directory names."
;;;###autoload
(defvar project-prefix-map
(let ((map (make-sparse-keymap)))
+ (define-key map "!" 'project-shell-command)
+ (define-key map "&" 'project-async-shell-command)
(define-key map "f" 'project-find-file)
(define-key map "F" 'project-or-external-find-file)
(define-key map "b" 'project-switch-to-buffer)
@@ -882,6 +884,20 @@ if one already exists."
(pop-to-buffer eshell-buffer)
(eshell t))))
+;;;###autoload
+(defun project-async-shell-command ()
+ "Run `async-shell-command' in the current project's root directory."
+ (interactive)
+ (let ((default-directory (project-root (project-current t))))
+ (call-interactively #'async-shell-command)))
+
+;;;###autoload
+(defun project-shell-command ()
+ "Run `shell-command' in the current project's root directory."
+ (interactive)
+ (let ((default-directory (project-root (project-current t))))
+ (call-interactively #'shell-command)))
+
(declare-function fileloop-continue "fileloop" ())
;;;###autoload
diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el
index 9cd84cf713b..3d66483b83e 100644
--- a/lisp/progmodes/vhdl-mode.el
+++ b/lisp/progmodes/vhdl-mode.el
@@ -2304,10 +2304,6 @@ Ignore byte-compiler warnings you might see."
(defvaralias 'vhdl-last-input-event 'last-input-char)
(defvaralias 'vhdl-last-input-event 'last-input-event))
-;; `help-print-return-message' changed to `print-help-return-message' in Emacs
-;;;(unless (fboundp 'help-print-return-message)
-;;; (defalias 'help-print-return-message 'print-help-return-message))
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Compatibility with older VHDL Mode versions
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index bbf899e7017..de2053c3c99 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -1,7 +1,7 @@
;;; xref.el --- Cross-referencing commands -*-lexical-binding:t-*-
;; Copyright (C) 2014-2020 Free Software Foundation, Inc.
-;; Version: 1.0.2
+;; Version: 1.0.3
;; Package-Requires: ((emacs "26.3"))
;; This is a GNU ELPA :core package. Avoid functionality that is not
@@ -608,7 +608,10 @@ buffer."
(user-error "No reference at point")))
(xref--current-item xref))
(xref--show-location (xref-item-location xref) (if quit 'quit t))
- (next-error-found buffer (current-buffer))))
+ (if (fboundp 'next-error-found)
+ (next-error-found buffer (current-buffer))
+ ;; Emacs < 27
+ (setq next-error-last-buffer buffer))))
(defun xref-quit-and-goto-xref ()
"Quit *xref* buffer, then jump to xref on current line."
@@ -958,8 +961,18 @@ Accepts the same arguments as `xref-show-xrefs-function'."
(defvar xref--read-pattern-history nil)
-(defun xref--show-xrefs (fetcher display-action)
+(defun xref--show-xrefs (fetcher display-action &optional _always-show-list)
(xref--push-markers)
+ (unless (functionp fetcher)
+ ;; Old convention.
+ (let ((xrefs fetcher))
+ (setq fetcher
+ (lambda ()
+ (if (eq xrefs 'called-already)
+ (user-error "Refresh is not supported")
+ (prog1
+ xrefs
+ (setq xrefs 'called-already)))))))
(funcall xref-show-xrefs-function fetcher
`((window . ,(selected-window))
(display-action . ,display-action))))
diff --git a/lisp/progmodes/xscheme.el b/lisp/progmodes/xscheme.el
index 8dfb3a40dd1..c6997862f7f 100644
--- a/lisp/progmodes/xscheme.el
+++ b/lisp/progmodes/xscheme.el
@@ -446,8 +446,6 @@ Entry to this mode runs `scheme-mode-hook' and then
(scheme-interaction-mode-initialize)
(scheme-interaction-mode t)))))
-(define-obsolete-function-alias 'advertised-xscheme-send-previous-expression
- 'xscheme-send-previous-expression "23.2")
;;;; Debugger Mode
diff --git a/lisp/ps-print.el b/lisp/ps-print.el
index 1ca4a23ab2c..67ee4d24390 100644
--- a/lisp/ps-print.el
+++ b/lisp/ps-print.el
@@ -4523,7 +4523,7 @@ page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th
(let* ((name (concat (file-name-nondirectory (or (buffer-file-name)
(buffer-name)))
".ps"))
- (prompt (format "Save PostScript to file (default %s): " name))
+ (prompt (format-prompt "Save PostScript to file" name))
(res (read-file-name prompt default-directory name nil)))
(while (cond ((file-directory-p res)
(ding)
diff --git a/lisp/simple.el b/lisp/simple.el
index fa6e154004b..eedbff2d087 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -6122,8 +6122,6 @@ Does not set point. Does nothing if mark ring is empty."
(pop mark-ring))
(deactivate-mark))
-(define-obsolete-function-alias
- 'exchange-dot-and-mark 'exchange-point-and-mark "23.3")
(defun exchange-point-and-mark (&optional arg)
"Put the mark where point is now, and point where the mark is now.
This command works even when the mark is not active,
@@ -8409,18 +8407,6 @@ Called with three arguments (BEG END TEXT), it should replace the text
between BEG and END with TEXT. Expected to be set buffer-locally
in the *Completions* buffer.")
-(defvar completion-base-size nil
- "Number of chars before point not involved in completion.
-This is a local variable in the completion list buffer.
-It refers to the chars in the minibuffer if completing in the
-minibuffer, or in `completion-reference-buffer' otherwise.
-Only characters in the field at point are included.
-
-If nil, Emacs determines which part of the tail end of the
-buffer's text is involved in completion by comparing the text
-directly.")
-(make-obsolete-variable 'completion-base-size 'completion-base-position "23.2")
-
(defun delete-completion-window ()
"Delete the completion list window.
Go to the window from which completion was requested."
@@ -8474,7 +8460,6 @@ If EVENT, use EVENT's position to determine the starting position."
(run-hooks 'mouse-leave-buffer-hook)
(with-current-buffer (window-buffer (posn-window (event-start event)))
(let ((buffer completion-reference-buffer)
- (base-size completion-base-size)
(base-position completion-base-position)
(insert-function completion-list-insert-choice-function)
(choice
@@ -8501,10 +8486,6 @@ If EVENT, use EVENT's position to determine the starting position."
(choose-completion-string
choice buffer
(or base-position
- (when base-size
- ;; Someone's using old completion code that doesn't know
- ;; about base-position yet.
- (list (+ base-size (field-beginning))))
;; If all else fails, just guess.
(list (choose-completion-guess-base-position choice)))
insert-function)))))
@@ -8532,10 +8513,6 @@ If EVENT, use EVENT's position to determine the starting position."
(forward-char 1))
(point))))
-(defun choose-completion-delete-max-match (string)
- (declare (obsolete choose-completion-guess-base-position "23.2"))
- (delete-region (choose-completion-guess-base-position string) (point)))
-
(defvar choose-completion-string-functions nil
"Functions that may override the normal insertion of a completion choice.
These functions are called in order with three arguments:
@@ -8564,13 +8541,6 @@ back on `completion-list-insert-choice-function' when nil."
;; unless it is reading a file name and CHOICE is a directory,
;; or completion-no-auto-exit is non-nil.
- ;; Some older code may call us passing `base-size' instead of
- ;; `base-position'. It's difficult to make any use of `base-size',
- ;; so we just ignore it.
- (unless (consp base-position)
- (message "Obsolete `base-size' passed to choose-completion-string")
- (setq base-position nil))
-
(let* ((buffer (or buffer completion-reference-buffer))
(mini-p (minibufferp buffer)))
;; If BUFFER is a minibuffer, barf unless it's the currently
@@ -8626,8 +8596,7 @@ Type \\<completion-list-mode-map>\\[choose-completion] in the completion list\
to select the completion near point.
Or click to select one with the mouse.
-\\{completion-list-mode-map}"
- (set (make-local-variable 'completion-base-size) nil))
+\\{completion-list-mode-map}")
(defun completion-list-mode-finish ()
"Finish setup of the completions buffer.
@@ -8664,14 +8633,11 @@ Called from `temp-buffer-show-hook'."
(if minibuffer-completing-file-name
(file-name-as-directory
(expand-file-name
- (buffer-substring (minibuffer-prompt-end)
- (- (point) (or completion-base-size 0))))))))
+ (buffer-substring (minibuffer-prompt-end) (point)))))))
(with-current-buffer standard-output
- (let ((base-size completion-base-size) ;Read before killing localvars.
- (base-position completion-base-position)
+ (let ((base-position completion-base-position)
(insert-fun completion-list-insert-choice-function))
(completion-list-mode)
- (set (make-local-variable 'completion-base-size) base-size)
(set (make-local-variable 'completion-base-position) base-position)
(set (make-local-variable 'completion-list-insert-choice-function)
insert-fun))
diff --git a/lisp/startup.el b/lisp/startup.el
index 536a3de17a7..0a81c878af8 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -463,9 +463,6 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
(and (string-match "\\`[[:alnum:]]" file)
;; The lower-case variants of RCS and CVS are for DOS/Windows.
(not (member file '("RCS" "CVS" "rcs" "cvs")))
- ;; Avoid doing a `stat' when it isn't necessary because
- ;; that can cause trouble when an NFS server is down.
- (not (string-match "\\.elc?\\'" file))
(file-directory-p file)
(let ((expanded (expand-file-name file)))
(or (file-exists-p (expand-file-name ".nosearch" expanded))
@@ -648,16 +645,13 @@ It is the default value of the variable `top-level'."
(list (default-value 'user-full-name)))
;; If the PWD environment variable isn't accurate, delete it.
(let ((pwd (getenv "PWD")))
- (and (stringp pwd)
- ;; Use FOO/., so that if FOO is a symlink, file-attributes
- ;; describes the directory linked to, not FOO itself.
+ (and pwd
(or (and default-directory
(ignore-errors
(equal (file-attributes
- (concat (file-name-as-directory pwd) "."))
+ (file-name-as-directory pwd))
(file-attributes
- (concat (file-name-as-directory default-directory)
- ".")))))
+ (file-name-as-directory default-directory)))))
(setq process-environment
(delete (concat "PWD=" pwd)
process-environment)))))
diff --git a/lisp/subr.el b/lisp/subr.el
index 093cacc8cb6..6e866015509 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -771,7 +771,6 @@ If that is non-nil, the element matches; then `assoc-default'
If no element matches, the value is nil.
If TEST is omitted or nil, `equal' is used."
- (declare (side-effect-free t))
(let (found (tail alist) value)
(while (and tail (not found))
(let ((elt (car tail)))
@@ -3076,9 +3075,17 @@ If MESSAGE is nil, instructions to type EXIT-CHAR are displayed there."
o1))
(defun remove-overlays (&optional beg end name val)
- "Clear BEG and END of overlays whose property NAME has value VAL.
-Overlays might be moved and/or split.
-BEG and END default respectively to the beginning and end of buffer."
+ "Remove overlays between BEG and END that have property NAME with value VAL.
+Overlays might be moved and/or split. If any targeted overlays
+start before BEG, the overlays will be altered so that they end
+at BEG. Likewise, if the targeted overlays end after END, they
+will be altered so that they start at END. Overlays that start
+at or after BEG and end before END will be removed completely.
+
+BEG and END default respectively to the beginning and end of the
+buffer.
+Values are compared with `eq'.
+If either NAME or VAL are specified, both should be specified."
;; This speeds up the loops over overlays.
(unless beg (setq beg (point-min)))
(unless end (setq end (point-max)))
@@ -4675,13 +4682,6 @@ This function is called directly from the C code."
;; Finally, run any other hook.
(run-hook-with-args 'after-load-functions abs-file))
-(defun eval-next-after-load (file)
- "Read the following input sexp, and run it whenever FILE is loaded.
-This makes or adds to an entry on `after-load-alist'.
-FILE should be the name of a library, with no directory name."
- (declare (obsolete eval-after-load "23.2"))
- (eval-after-load file (read)))
-
(defun display-delayed-warnings ()
"Display delayed warnings from `delayed-warnings-list'.
diff --git a/lisp/term.el b/lisp/term.el
index 99f1bf4f54f..e77c2c1331b 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -241,9 +241,9 @@
;; printf '\033AnSiTu %s\n' "$USER"
;; printf '\033AnSiTc %s\n' "$PWD"
;;
-;; cd() { command cd "$@"; printf '\033AnSiTc %s\n' "$PWD"; }
-;; pushd() { command pushd "$@"; printf '\033AnSiTc %s\n' "$PWD"; }
-;; popd() { command popd "$@"; printf '\033AnSiTc %s\n' "$PWD"; }
+;; cd() { command cd "$@" && printf '\033AnSiTc %s\n' "$PWD"; }
+;; pushd() { command pushd "$@" && printf '\033AnSiTc %s\n' "$PWD"; }
+;; popd() { command popd "$@" && printf '\033AnSiTc %s\n' "$PWD"; }
;;
;; # Use custom dircolors in term buffers.
;; # eval $(dircolors $HOME/.emacs_dircolors)
@@ -4110,53 +4110,6 @@ see `expand-file-name' and `substitute-in-file-name'. For completion see
(term-dynamic-complete-filename))
-(defun term-dynamic-simple-complete (stub candidates)
- "Dynamically complete STUB from CANDIDATES list.
-This function inserts completion characters at point by completing STUB from
-the strings in CANDIDATES. A completions listing may be shown in a help buffer
-if completion is ambiguous.
-
-Returns nil if no completion was inserted.
-Returns `sole' if completed with the only completion match.
-Returns `shortest' if completed with the shortest of the completion matches.
-Returns `partial' if completed as far as possible with the completion matches.
-Returns `listed' if a completion listing was shown.
-
-See also `term-dynamic-complete-filename'."
- (declare (obsolete completion-in-region "23.2"))
- (let* ((completion-ignore-case nil)
- (completions (all-completions stub candidates)))
- (cond ((null completions)
- (message "No completions of %s" stub)
- nil)
- ((= 1 (length completions)) ; Gotcha!
- (let ((completion (car completions)))
- (if (string-equal completion stub)
- (message "Sole completion")
- (insert (substring completion (length stub)))
- (message "Completed"))
- (when term-completion-addsuffix (insert " "))
- 'sole))
- (t ; There's no unique completion.
- (let ((completion (try-completion stub candidates)))
- ;; Insert the longest substring.
- (insert (substring completion (length stub)))
- (cond ((and term-completion-recexact term-completion-addsuffix
- (string-equal stub completion)
- (member completion completions))
- ;; It's not unique, but user wants shortest match.
- (insert " ")
- (message "Completed shortest")
- 'shortest)
- ((or term-completion-autolist
- (string-equal stub completion))
- ;; It's not unique, list possible completions.
- (term-dynamic-list-completions completions)
- 'listed)
- (t
- (message "Partially completed")
- 'partial)))))))
-
(defun term-dynamic-list-filename-completions ()
"List in help buffer possible completions of the filename at point."
(interactive)
@@ -4186,7 +4139,7 @@ Typing SPC flushes the help buffer."
(eq (window-buffer (posn-window (event-start first)))
(get-buffer "*Completions*"))
(memq (key-binding key)
- '(mouse-choose-completion choose-completion))))
+ '(choose-completion))))
;; If the user does choose-completion with the mouse,
;; execute the command, then delete the completion window.
(progn
diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el
index 23f96d7e0ee..98059287210 100644
--- a/lisp/textmodes/flyspell.el
+++ b/lisp/textmodes/flyspell.el
@@ -398,8 +398,8 @@ like <img alt=\"Some thing.\">."
(let ((f (get-text-property (1- (point)) 'face)))
(memq f flyspell-prog-text-faces))))
-;; Records the binding of M-TAB in effect before flyspell was activated.
-(defvar flyspell--prev-meta-tab-binding)
+(defvar flyspell--prev-meta-tab-binding nil
+ "Records the binding of M-TAB in effect before flyspell was activated.")
;;;###autoload
(defun flyspell-prog-mode ()
@@ -533,7 +533,7 @@ in your init file.
(progn
(when flyspell-use-mouse-3-for-menu
(flyspell--set-use-mouse-3-for-menu 'flyspell-use-mouse-3-for-menu t))
- (flyspell-mode-on))
+ (flyspell-mode-on (called-interactively-p 'interactive)))
(error (message "Error enabling Flyspell mode:\n%s" (cdr err))
(flyspell-mode -1)))
(flyspell-mode-off)))
@@ -550,12 +550,9 @@ in your init file.
(custom-add-option 'text-mode-hook 'turn-on-flyspell)
-;;*---------------------------------------------------------------------*/
-;;* flyspell-buffers ... */
-;;* ------------------------------------------------------------- */
-;;* For remembering buffers running flyspell */
-;;*---------------------------------------------------------------------*/
-(defvar flyspell-buffers nil)
+(defvar flyspell-buffers nil
+ "For remembering buffers running flyspell")
+(make-obsolete-variable 'flyspell-buffers "not used." "28.1")
;;*---------------------------------------------------------------------*/
;;* flyspell-minibuffer-p ... */
@@ -611,8 +608,12 @@ in your init file.
;;*---------------------------------------------------------------------*/
;;* flyspell-mode-on ... */
;;*---------------------------------------------------------------------*/
-(defun flyspell-mode-on ()
- "Turn Flyspell mode on. Do not use this; use `flyspell-mode' instead."
+(defun flyspell-mode-on (&optional show-msg)
+ "Turn Flyspell mode on. Do not use this; use `flyspell-mode' instead.
+
+If optional argument SHOW-MSG is non-nil, show a welcome message
+if `flyspell-issue-message-flag' and `flyspell-issue-welcome-flag'
+are both non-nil."
(ispell-set-spellchecker-params) ; Initialize variables and dicts alists
(setq ispell-highlight-face 'flyspell-incorrect)
;; local dictionaries setup
@@ -644,15 +645,17 @@ in your init file.
(setq flyspell-generic-check-word-predicate mode-predicate)))
;; the welcome message
(if (and flyspell-issue-message-flag
- flyspell-issue-welcome-flag
- (called-interactively-p 'interactive))
- (let ((binding (where-is-internal 'flyspell-auto-correct-word
- nil 'non-ascii)))
- (message "%s"
- (if binding
- (format "Welcome to flyspell. Use %s or Mouse-2 to correct words."
- (key-description binding))
- "Welcome to flyspell. Use Mouse-2 to correct words.")))))
+ flyspell-issue-welcome-flag
+ show-msg)
+ (let* ((binding (where-is-internal 'flyspell-auto-correct-word
+ nil 'non-ascii))
+ (mouse-button (if flyspell-use-mouse-3-for-menu
+ "Mouse-3" "Mouse-2")))
+ (message (format-message
+ "Welcome to Flyspell. Use %s to correct words."
+ (if binding
+ (format "`%s' or `%s'" (key-description binding) mouse-button)
+ (format "`%s'" mouse-button)))))))
;;*---------------------------------------------------------------------*/
;;* flyspell-delay-commands ... */
@@ -1802,7 +1805,9 @@ for the overlay."
(overlay-put overlay 'mouse-face mouse-face)
(overlay-put overlay 'flyspell-overlay t)
(overlay-put overlay 'evaporate t)
- (overlay-put overlay 'help-echo "mouse-2: correct word at point")
+ (overlay-put overlay 'help-echo (concat (if flyspell-use-mouse-3-for-menu
+ "mouse-3"
+ "mouse-2") ": correct word at point"))
;; If misspelled text has a 'keymap' property, let that remain in
;; effect for the bindings that flyspell-mouse-map doesn't override.
(set-keymap-parent flyspell-mouse-map (get-char-property beg 'keymap))
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index 8252da604eb..86452ff1e87 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -44,6 +44,7 @@
;; ispell-buffer
;; ispell-message
;; ispell-comments-and-strings
+;; ispell-comment-or-string-at-point
;; ispell-continue
;; ispell-complete-word
;; ispell-complete-word-interior-frag
@@ -1095,28 +1096,38 @@ to dictionaries found, and will remove aliases from the list
in `ispell-dicts-name2locale-equivs-alist' if an explicit
dictionary from that list was found."
(let ((hunspell-found-dicts
- (split-string
- (with-temp-buffer
- (ispell-call-process ispell-program-name
- null-device
- t
- nil
- "-D"
- ;; Use -a to prevent Hunspell from
- ;; trying to initialize its
- ;; curses/termcap UI, which causes it
- ;; to crash or fail to start in some
- ;; MS-Windows ports.
- "-a"
- ;; Hunspell 1.7.0 (and later?) won't
- ;; show LOADED DICTIONARY unless
- ;; there's at least one file argument
- ;; on the command line. So we feed
- ;; it with the null device.
- null-device)
- (buffer-string))
- "[\n\r]+"
- t))
+ (seq-filter
+ (lambda (str)
+ (when (string-match
+ ;; Hunspell gives this error when there is some
+ ;; installation problem, for example if $LANG is unset.
+ (concat "^Can't open affix or dictionary files "
+ "for dictionary named \"default\".$")
+ str)
+ (user-error "Hunspell error (is $LANG unset?): %s" str))
+ (file-name-absolute-p str))
+ (split-string
+ (with-temp-buffer
+ (ispell-call-process ispell-program-name
+ null-device
+ t
+ nil
+ "-D"
+ ;; Use -a to prevent Hunspell from
+ ;; trying to initialize its
+ ;; curses/termcap UI, which causes it
+ ;; to crash or fail to start in some
+ ;; MS-Windows ports.
+ "-a"
+ ;; Hunspell 1.7.0 (and later?) won't
+ ;; show LOADED DICTIONARY unless
+ ;; there's at least one file argument
+ ;; on the command line. So we feed
+ ;; it with the null device.
+ null-device)
+ (buffer-string))
+ "[\n\r]+"
+ t)))
hunspell-default-dict
hunspell-default-dict-entry
hunspell-multi-dict)
@@ -3580,24 +3591,40 @@ Returns the sum SHIFT due to changes in word replacements."
;;;###autoload
-(defun ispell-comments-and-strings ()
- "Check comments and strings in the current buffer for spelling errors."
- (interactive)
- (goto-char (point-min))
+(defun ispell-comments-and-strings (&optional start end)
+ "Check comments and strings in the current buffer for spelling errors.
+If called interactively with an active region, check only comments and
+strings in the region.
+When called from Lisp, START and END buffer positions can be provided
+to limit the check."
+ (interactive (when (use-region-p) (list (region-beginning) (region-end))))
+ (unless end (setq end (point-max)))
+ (goto-char (or start (point-min)))
(let (state done)
(while (not done)
(setq done t)
- (setq state (parse-partial-sexp (point) (point-max)
- nil nil state 'syntax-table))
+ (setq state (parse-partial-sexp (point) end nil nil state 'syntax-table))
(if (or (nth 3 state) (nth 4 state))
(let ((start (point)))
- (setq state (parse-partial-sexp start (point-max)
+ (setq state (parse-partial-sexp start end
nil nil state 'syntax-table))
(if (or (nth 3 state) (nth 4 state))
(error "Unterminated string or comment"))
(save-excursion
(setq done (not (ispell-region start (point))))))))))
+;;;###autoload
+(defun ispell-comment-or-string-at-point ()
+ "Check the comment or string containing point for spelling errors."
+ (interactive)
+ (save-excursion
+ (let ((state (syntax-ppss)))
+ (if (or (nth 3 state) (nth 4 state))
+ (ispell-region (nth 8 state)
+ (progn (parse-partial-sexp (point) (point-max)
+ nil nil state 'syntax-table)
+ (point)))
+ (user-error "Not inside a string or comment")))))
;;;###autoload
(defun ispell-buffer ()
diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4
index 5bfa1473edd..d2fdbd82e73 100644
--- a/m4/gnulib-comp.m4
+++ b/m4/gnulib-comp.m4
@@ -145,6 +145,7 @@ AC_DEFUN([gl_EARLY],
# Code from module regex:
# Code from module root-uid:
# Code from module sig2str:
+ # Code from module sigdescr_np:
# Code from module signal-h:
# Code from module snippet/_Noreturn:
# Code from module snippet/arg-nonnull:
@@ -424,6 +425,11 @@ AC_DEFUN([gl_INIT],
AC_LIBOBJ([sig2str])
gl_PREREQ_SIG2STR
fi
+ gl_FUNC_SIGDESCR_NP
+ if test $HAVE_SIGDESCR_NP = 0; then
+ AC_LIBOBJ([sigdescr_np])
+ fi
+ gl_STRING_MODULE_INDICATOR([sigdescr_np])
gl_SIGNAL_H
gl_TYPE_SOCKLEN_T
gt_TYPE_SSIZE_T
@@ -1059,6 +1065,7 @@ AC_DEFUN([gl_FILE_LIST], [
lib/sha512.h
lib/sig2str.c
lib/sig2str.h
+ lib/sigdescr_np.c
lib/signal.in.h
lib/stat-time.c
lib/stat-time.h
@@ -1181,6 +1188,7 @@ AC_DEFUN([gl_FILE_LIST], [
m4/open-slash.m4
m4/open.m4
m4/pathmax.m4
+ m4/pid_t.m4
m4/pipe2.m4
m4/pselect.m4
m4/pthread_sigmask.m4
@@ -1191,6 +1199,7 @@ AC_DEFUN([gl_FILE_LIST], [
m4/sha256.m4
m4/sha512.m4
m4/sig2str.m4
+ m4/sigdescr_np.m4
m4/signal_h.m4
m4/socklen.m4
m4/ssize_t.m4
diff --git a/m4/inttypes.m4 b/m4/inttypes.m4
index 28bac816b69..84b1654ea26 100644
--- a/m4/inttypes.m4
+++ b/m4/inttypes.m4
@@ -1,4 +1,4 @@
-# inttypes.m4 serial 31
+# inttypes.m4 serial 32
dnl Copyright (C) 2006-2020 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -44,7 +44,7 @@ AC_DEFUN([gl_INTTYPES_PRI_SCN],
#ifdef _WIN64
LLP64
#endif
- ]]),
+ ]])
],
[PRIPTR_PREFIX='"l"'],
[PRIPTR_PREFIX='"ll"'])
diff --git a/m4/sigdescr_np.m4 b/m4/sigdescr_np.m4
new file mode 100644
index 00000000000..f0f3f979e83
--- /dev/null
+++ b/m4/sigdescr_np.m4
@@ -0,0 +1,17 @@
+# sigdescr_np.m4 serial 1
+dnl Copyright (C) 2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SIGDESCR_NP],
+[
+ dnl Persuade glibc <string.h> to declare sigdescr_np().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_FUNCS([sigdescr_np])
+ if test $ac_cv_func_sigdescr_np = no; then
+ HAVE_SIGDESCR_NP=0
+ fi
+])
diff --git a/m4/string_h.m4 b/m4/string_h.m4
index d519beaa591..d7c12aaae87 100644
--- a/m4/string_h.m4
+++ b/m4/string_h.m4
@@ -5,7 +5,7 @@
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 25
+# serial 26
# Written by Paul Eggert.
@@ -28,7 +28,7 @@ AC_DEFUN([gl_HEADER_STRING_H_BODY],
]],
[ffsl ffsll memmem mempcpy memrchr rawmemchr stpcpy stpncpy strchrnul
strdup strncat strndup strnlen strpbrk strsep strcasestr strtok_r
- strerror_r sigabbrev_np strsignal strverscmp])
+ strerror_r sigabbrev_np sigdescr_np strsignal strverscmp])
AC_REQUIRE([AC_C_RESTRICT])
])
@@ -81,6 +81,7 @@ AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS],
GNULIB_STRERROR=0; AC_SUBST([GNULIB_STRERROR])
GNULIB_STRERROR_R=0; AC_SUBST([GNULIB_STRERROR_R])
GNULIB_SIGABBREV_NP=0;AC_SUBST([GNULIB_SIGABBREV_NP])
+ GNULIB_SIGDESCR_NP=0; AC_SUBST([GNULIB_SIGDESCR_NP])
GNULIB_STRSIGNAL=0; AC_SUBST([GNULIB_STRSIGNAL])
GNULIB_STRVERSCMP=0; AC_SUBST([GNULIB_STRVERSCMP])
HAVE_MBSLEN=0; AC_SUBST([HAVE_MBSLEN])
@@ -104,6 +105,7 @@ AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS],
HAVE_DECL_STRTOK_R=1; AC_SUBST([HAVE_DECL_STRTOK_R])
HAVE_DECL_STRERROR_R=1; AC_SUBST([HAVE_DECL_STRERROR_R])
HAVE_SIGABBREV_NP=1; AC_SUBST([HAVE_SIGABBREV_NP])
+ HAVE_SIGDESCR_NP=1; AC_SUBST([HAVE_SIGDESCR_NP])
HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL])
HAVE_STRVERSCMP=1; AC_SUBST([HAVE_STRVERSCMP])
REPLACE_MEMCHR=0; AC_SUBST([REPLACE_MEMCHR])
diff --git a/src/character.c b/src/character.c
index 4902e564b1d..5860f6a0c8c 100644
--- a/src/character.c
+++ b/src/character.c
@@ -495,9 +495,9 @@ parse_str_as_multibyte (const unsigned char *str, ptrdiff_t len,
/* Arrange unibyte text at STR of NBYTES bytes as a multibyte text.
It actually converts only such 8-bit characters that don't construct
- a multibyte sequence to multibyte forms of Latin-1 characters. If
- NCHARS is nonzero, set *NCHARS to the number of characters in the
- text. It is assured that we can use LEN bytes at STR as a work
+ a multibyte sequence to multibyte forms of raw bytes. If NCHARS
+ is nonzero, set *NCHARS to the number of characters in the text.
+ It is assured that we can use LEN bytes at STR as a work
area and that is enough. Return the number of bytes of the
resulting text. */
diff --git a/src/coding.c b/src/coding.c
index 51bd441de9d..221a9cad898 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -10895,7 +10895,10 @@ usage: (define-coding-system-internal ...) */)
ASET (attrs, coding_attr_base_name, name);
Lisp_Object val = args[coding_arg_mnemonic];
- if (! STRINGP (val))
+ /* decode_mode_spec_coding assumes the mnemonic is a single character. */
+ if (STRINGP (val))
+ val = make_fixnum (STRING_CHAR (SDATA (val)));
+ else
CHECK_CHARACTER (val);
ASET (attrs, coding_attr_mnemonic, val);
@@ -11408,7 +11411,10 @@ DEFUN ("coding-system-put", Fcoding_system_put, Scoding_system_put,
attrs = AREF (spec, 0);
if (EQ (prop, QCmnemonic))
{
- if (! STRINGP (val))
+ /* decode_mode_spec_coding assumes the mnemonic is a single character. */
+ if (STRINGP (val))
+ val = make_fixnum (STRING_CHAR (SDATA (val)));
+ else
CHECK_CHARACTER (val);
ASET (attrs, coding_attr_mnemonic, val);
}
diff --git a/src/dispextern.h b/src/dispextern.h
index 311867a0c8c..956ca96eb61 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -3056,9 +3056,9 @@ struct image
if necessary. */
unsigned long background;
- /* Foreground and background colors of the frame on which the image
+ /* Foreground and background colors of the face on which the image
is created. */
- unsigned long frame_foreground, frame_background;
+ unsigned long face_foreground, face_background;
/* True if this image has a `transparent' background -- that is, is
uses an image mask. The accessor macro for this is
@@ -3475,7 +3475,7 @@ void clear_image_caches (Lisp_Object);
void mark_image_cache (struct image_cache *);
bool valid_image_p (Lisp_Object);
void prepare_image_for_display (struct frame *, struct image *);
-ptrdiff_t lookup_image (struct frame *, Lisp_Object);
+ptrdiff_t lookup_image (struct frame *, Lisp_Object, int);
#if defined HAVE_X_WINDOWS || defined USE_CAIRO || defined HAVE_NS
#define RGB_PIXEL_COLOR unsigned long
diff --git a/src/editfns.c b/src/editfns.c
index 949f3825a3c..7e1e24ef16a 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -1877,9 +1877,6 @@ determines whether case is significant or ignored. */)
#undef EQUAL
#define USE_HEURISTIC
-/* Counter used to rarely_quit in replace-buffer-contents. */
-static unsigned short rbc_quitcounter;
-
#define XVECREF_YVECREF_EQUAL(ctx, xoff, yoff) \
buffer_chars_equal ((ctx), (xoff), (yoff))
@@ -1900,10 +1897,11 @@ static unsigned short rbc_quitcounter;
unsigned char *deletions; \
unsigned char *insertions; \
struct timespec time_limit; \
- unsigned int early_abort_tests;
+ sys_jmp_buf jmp; \
+ unsigned short quitcounter;
-#define NOTE_DELETE(ctx, xoff) set_bit ((ctx)->deletions, (xoff))
-#define NOTE_INSERT(ctx, yoff) set_bit ((ctx)->insertions, (yoff))
+#define NOTE_DELETE(ctx, xoff) set_bit ((ctx)->deletions, xoff)
+#define NOTE_INSERT(ctx, yoff) set_bit ((ctx)->insertions, yoff)
#define EARLY_ABORT(ctx) compareseq_early_abort (ctx)
struct context;
@@ -1956,6 +1954,28 @@ nil. */)
if (a == b)
error ("Cannot replace a buffer with itself");
+ ptrdiff_t too_expensive;
+ if (NILP (max_costs))
+ too_expensive = 1000000;
+ else if (FIXNUMP (max_costs))
+ too_expensive = clip_to_bounds (0, XFIXNUM (max_costs), PTRDIFF_MAX);
+ else
+ {
+ CHECK_INTEGER (max_costs);
+ too_expensive = NILP (Fnatnump (max_costs)) ? 0 : PTRDIFF_MAX;
+ }
+
+ struct timespec time_limit = make_timespec (0, -1);
+ if (!NILP (max_secs))
+ {
+ struct timespec
+ tlim = timespec_add (current_timespec (),
+ lisp_time_argument (max_secs)),
+ tmax = make_timespec (TYPE_MAXIMUM (time_t), TIMESPEC_HZ - 1);
+ if (timespec_cmp (tlim, tmax) < 0)
+ time_limit = tlim;
+ }
+
ptrdiff_t min_a = BEGV;
ptrdiff_t min_b = BUF_BEGV (b);
ptrdiff_t size_a = ZV - min_a;
@@ -1985,36 +2005,24 @@ nil. */)
ptrdiff_t count = SPECPDL_INDEX ();
- /* FIXME: It is not documented how to initialize the contents of the
- context structure. This code cargo-cults from the existing
- caller in src/analyze.c of GNU Diffutils, which appears to
- work. */
ptrdiff_t diags = size_a + size_b + 3;
+ ptrdiff_t del_bytes = size_a / CHAR_BIT + 1;
+ ptrdiff_t ins_bytes = size_b / CHAR_BIT + 1;
ptrdiff_t *buffer;
+ ptrdiff_t bytes_needed;
+ if (INT_MULTIPLY_WRAPV (diags, 2 * sizeof *buffer, &bytes_needed)
+ || INT_ADD_WRAPV (del_bytes + ins_bytes, bytes_needed, &bytes_needed))
+ memory_full (SIZE_MAX);
USE_SAFE_ALLOCA;
- SAFE_NALLOCA (buffer, 2, diags);
-
- if (NILP (max_costs))
- XSETFASTINT (max_costs, 1000000);
- else
- CHECK_FIXNUM (max_costs);
-
- struct timespec time_limit = make_timespec (0, -1);
- if (!NILP (max_secs))
- {
- struct timespec
- tlim = timespec_add (current_timespec (),
- lisp_time_argument (max_secs)),
- tmax = make_timespec (TYPE_MAXIMUM (time_t), TIMESPEC_HZ - 1);
- if (timespec_cmp (tlim, tmax) < 0)
- time_limit = tlim;
- }
+ buffer = SAFE_ALLOCA (bytes_needed);
+ unsigned char *deletions_insertions = memset (buffer + 2 * diags, 0,
+ del_bytes + ins_bytes);
- /* Micro-optimization: Casting to size_t generates much better
- code. */
- ptrdiff_t del_bytes = (size_t) size_a / CHAR_BIT + 1;
- ptrdiff_t ins_bytes = (size_t) size_b / CHAR_BIT + 1;
+ /* FIXME: It is not documented how to initialize the contents of the
+ context structure. This code cargo-cults from the existing
+ caller in src/analyze.c of GNU Diffutils, which appears to
+ work. */
struct context ctx = {
.buffer_a = a,
.buffer_b = b,
@@ -2022,21 +2030,22 @@ nil. */)
.beg_b = min_b,
.a_unibyte = BUF_ZV (a) == BUF_ZV_BYTE (a),
.b_unibyte = BUF_ZV (b) == BUF_ZV_BYTE (b),
- .deletions = SAFE_ALLOCA (del_bytes),
- .insertions = SAFE_ALLOCA (ins_bytes),
+ .deletions = deletions_insertions,
+ .insertions = deletions_insertions + del_bytes,
.fdiag = buffer + size_b + 1,
.bdiag = buffer + diags + size_b + 1,
.heuristic = true,
- .too_expensive = XFIXNUM (max_costs),
+ .too_expensive = too_expensive,
.time_limit = time_limit,
- .early_abort_tests = 0
};
- memclear (ctx.deletions, del_bytes);
- memclear (ctx.insertions, ins_bytes);
/* compareseq requires indices to be zero-based. We add BEGV back
later. */
- bool early_abort = compareseq (0, size_a, 0, size_b, false, &ctx);
+ bool early_abort;
+ if (! sys_setjmp (ctx.jmp))
+ early_abort = compareseq (0, size_a, 0, size_b, false, &ctx);
+ else
+ early_abort = true;
if (early_abort)
{
@@ -2046,8 +2055,6 @@ nil. */)
return Qnil;
}
- rbc_quitcounter = 0;
-
Fundo_boundary ();
bool modification_hooks_inhibited = false;
record_unwind_protect_excursion ();
@@ -2071,13 +2078,12 @@ nil. */)
walk backwards, we don’t have to keep the positions in sync. */
while (i >= 0 || j >= 0)
{
- /* Allow the user to quit if this gets too slow. */
- rarely_quit (++rbc_quitcounter);
+ rarely_quit (++ctx.quitcounter);
/* Check whether there is a change (insertion or deletion)
before the current position. */
- if ((i > 0 && bit_is_set (ctx.deletions, i - 1)) ||
- (j > 0 && bit_is_set (ctx.insertions, j - 1)))
+ if ((i > 0 && bit_is_set (ctx.deletions, i - 1))
+ || (j > 0 && bit_is_set (ctx.insertions, j - 1)))
{
ptrdiff_t end_a = min_a + i;
ptrdiff_t end_b = min_b + j;
@@ -2087,8 +2093,6 @@ nil. */)
while (j > 0 && bit_is_set (ctx.insertions, j - 1))
--j;
- rarely_quit (rbc_quitcounter++);
-
ptrdiff_t beg_a = min_a + i;
ptrdiff_t beg_b = min_b + j;
eassert (beg_a <= end_a);
@@ -2108,7 +2112,6 @@ nil. */)
}
SAFE_FREE_UNBIND_TO (count, Qnil);
- rbc_quitcounter = 0;
if (modification_hooks_inhibited)
{
@@ -2122,21 +2125,15 @@ nil. */)
static void
set_bit (unsigned char *a, ptrdiff_t i)
{
- eassert (i >= 0);
- /* Micro-optimization: Casting to size_t generates much better
- code. */
- size_t j = i;
- a[j / CHAR_BIT] |= (1 << (j % CHAR_BIT));
+ eassume (0 <= i);
+ a[i / CHAR_BIT] |= (1 << (i % CHAR_BIT));
}
static bool
bit_is_set (const unsigned char *a, ptrdiff_t i)
{
- eassert (i >= 0);
- /* Micro-optimization: Casting to size_t generates much better
- code. */
- size_t j = i;
- return a[j / CHAR_BIT] & (1 << (j % CHAR_BIT));
+ eassume (0 <= i);
+ return a[i / CHAR_BIT] & (1 << (i % CHAR_BIT));
}
/* Return true if the characters at position POS_A of buffer
@@ -2155,12 +2152,16 @@ static bool
buffer_chars_equal (struct context *ctx,
ptrdiff_t pos_a, ptrdiff_t pos_b)
{
+ if (!++ctx->quitcounter)
+ {
+ maybe_quit ();
+ if (compareseq_early_abort (ctx))
+ sys_longjmp (ctx->jmp, 1);
+ }
+
pos_a += ctx->beg_a;
pos_b += ctx->beg_b;
- /* Allow the user to escape out of a slow compareseq call. */
- rarely_quit (++rbc_quitcounter);
-
ptrdiff_t bpos_a =
ctx->a_unibyte ? pos_a : buf_charpos_to_bytepos (ctx->buffer_a, pos_a);
ptrdiff_t bpos_b =
diff --git a/src/fileio.c b/src/fileio.c
index 37072d9b6bd..c91af36fdf6 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -827,9 +827,9 @@ the root directory. */)
ptrdiff_t tlen;
#ifdef DOS_NT
int drive = 0;
- bool collapse_newdir = true;
bool is_escaped = 0;
#endif /* DOS_NT */
+ bool collapse_newdir = true;
ptrdiff_t length, nbytes;
Lisp_Object handler, result, handled_name;
bool multibyte;
@@ -1065,7 +1065,7 @@ the root directory. */)
#endif /* WINDOWSNT */
#endif /* DOS_NT */
- /* If nm is absolute, look for `/./' or `/../' or `//''sequences; if
+ /* If nm is absolute, look for "/./" or "/../" or "//" sequences; if
none are found, we can probably return right away. We will avoid
allocating a new string if name is already fully expanded. */
if (
@@ -1183,9 +1183,7 @@ the root directory. */)
newdir = SSDATA (hdir);
newdirlim = newdir + SBYTES (hdir);
}
-#ifdef DOS_NT
collapse_newdir = false;
-#endif
}
else /* ~user/filename */
{
@@ -1205,9 +1203,7 @@ the root directory. */)
while (*++nm && !IS_DIRECTORY_SEP (*nm))
continue;
-#ifdef DOS_NT
collapse_newdir = false;
-#endif
}
/* If we don't find a user of that name, leave the name
@@ -1374,12 +1370,15 @@ the root directory. */)
}
#endif /* DOS_NT */
+ length = newdirlim - newdir;
+
+#ifdef DOS_NT
/* Ignore any slash at the end of newdir, unless newdir is
just "/" or "//". */
- length = newdirlim - newdir;
while (length > 1 && IS_DIRECTORY_SEP (newdir[length - 1])
&& ! (length == 2 && IS_DIRECTORY_SEP (newdir[0])))
length--;
+#endif
/* Now concatenate the directory and name to new space in the stack frame. */
tlen = length + file_name_as_directory_slop + (nmlim - nm) + 1;
@@ -1393,12 +1392,16 @@ the root directory. */)
#else /* not DOS_NT */
target = SAFE_ALLOCA (tlen);
#endif /* not DOS_NT */
- *target = 0;
nbytes = 0;
if (newdir)
{
- if (nm[0] == 0 || IS_DIRECTORY_SEP (nm[0]))
+#ifndef DOS_NT
+ bool treat_as_absolute = !collapse_newdir;
+#else
+ bool treat_as_absolute = !nm[0] || IS_DIRECTORY_SEP (nm[0]);
+#endif
+ if (treat_as_absolute)
{
#ifdef DOS_NT
/* If newdir is effectively "C:/", then the drive letter will have
@@ -1410,13 +1413,23 @@ the root directory. */)
&& newdir[1] == '\0'))
#endif
{
+ /* With ~ or ~user, leave NEWDIR as-is to avoid transforming
+ it from a symlink (or a regular file!) into a directory. */
memcpy (target, newdir, length);
- target[length] = 0;
nbytes = length;
}
}
else
nbytes = file_name_as_directory (target, newdir, length, multibyte);
+
+#ifndef DOS_NT
+ /* If TARGET ends in a directory separator, omit leading
+ directory separators from NM so that concatenating a TARGET "/"
+ to an NM "/foo" does not result in the incorrect "//foo". */
+ if (nbytes && IS_DIRECTORY_SEP (target[nbytes - 1]))
+ while (IS_DIRECTORY_SEP (nm[0]))
+ nm++;
+#endif
}
memcpy (target + nbytes, nm, nmlim - nm + 1);
@@ -1433,6 +1446,20 @@ the root directory. */)
{
*o++ = *p++;
}
+#ifndef DOS_NT
+ else if (p[1] == '.' && IS_DIRECTORY_SEP (p[2]))
+ {
+ /* Replace "/./" with "/". */
+ p += 2;
+ }
+ else if (p[1] == '.' && !p[2])
+ {
+ /* At the end of the file name, replace "/." with "/".
+ The trailing "/" is for symlinks. */
+ *o++ = *p;
+ p += 2;
+ }
+#else
else if (p[1] == '.'
&& (IS_DIRECTORY_SEP (p[2])
|| p[2] == 0))
@@ -1443,6 +1470,7 @@ the root directory. */)
*o++ = *p;
p += 2;
}
+#endif
else if (p[1] == '.' && p[2] == '.'
/* `/../' is the "superroot" on certain file systems.
Turned off on DOS_NT systems because they have no
@@ -1456,21 +1484,35 @@ the root directory. */)
#endif
&& (IS_DIRECTORY_SEP (p[3]) || p[3] == 0))
{
-#ifdef WINDOWSNT
+#ifndef DOS_NT
+ while (o != target)
+ {
+ o--;
+ if (IS_DIRECTORY_SEP (*o))
+ {
+ /* Keep "/" at the end of the name, for symlinks. */
+ o += p[3] == 0;
+
+ break;
+ }
+ }
+#else
+# ifdef WINDOWSNT
char *prev_o = o;
-#endif
+# endif
while (o != target && (--o, !IS_DIRECTORY_SEP (*o)))
continue;
-#ifdef WINDOWSNT
+# ifdef WINDOWSNT
/* Don't go below server level in UNC filenames. */
if (o == target + 1 && IS_DIRECTORY_SEP (*o)
&& IS_DIRECTORY_SEP (*target))
o = prev_o;
else
-#endif
+# endif
/* Keep initial / only if this is the whole name. */
if (o == target && IS_ANY_SEP (*o) && p[3] == 0)
++o;
+#endif
p += 3;
}
else if (IS_DIRECTORY_SEP (p[1])
diff --git a/src/font.c b/src/font.c
index 5c01c7ff796..2786a772dc3 100644
--- a/src/font.c
+++ b/src/font.c
@@ -5521,11 +5521,11 @@ footprint in sessions that use lots of different fonts. */);
#endif
DEFVAR_BOOL ("xft-ignore-color-fonts",
- Vxft_ignore_color_fonts,
+ xft_ignore_color_fonts,
doc: /*
Non-nil means don't query fontconfig for color fonts, since they often
cause Xft crashes. Only has an effect in Xft builds. */);
- Vxft_ignore_color_fonts = 1;
+ xft_ignore_color_fonts = true;
#ifdef HAVE_WINDOW_SYSTEM
#ifdef HAVE_FREETYPE
diff --git a/src/ftfont.c b/src/ftfont.c
index a904007a329..6fca9c85093 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -768,7 +768,7 @@ ftfont_spec_pattern (Lisp_Object spec, char *otlayout, struct OpenTypeSpec **ots
#if defined HAVE_XFT && defined FC_COLOR
/* We really don't like color fonts, they cause Xft crashes. See
Bug#30874. */
- if (Vxft_ignore_color_fonts
+ if (xft_ignore_color_fonts
&& ! FcPatternAddBool (pattern, FC_COLOR, FcFalse))
goto err;
#endif
@@ -911,7 +911,7 @@ ftfont_list (struct frame *f, Lisp_Object spec)
returns them even when it shouldn't really do so, so we
need to manually skip them here (Bug#37786). */
FcBool b;
- if (Vxft_ignore_color_fonts
+ if (xft_ignore_color_fonts
&& FcPatternGetBool (fontset->fonts[i], FC_COLOR, 0, &b)
== FcResultMatch && b != FcFalse)
continue;
diff --git a/src/gnutls.c b/src/gnutls.c
index 416fb154701..0010553a9d4 100644
--- a/src/gnutls.c
+++ b/src/gnutls.c
@@ -2298,6 +2298,8 @@ gnutls_symmetric_aead (bool encrypting, gnutls_cipher_algorithm_t gca,
# endif
}
+static Lisp_Object cipher_cache;
+
static Lisp_Object
gnutls_symmetric (bool encrypting, Lisp_Object cipher,
Lisp_Object key, Lisp_Object iv,
@@ -2329,7 +2331,9 @@ gnutls_symmetric (bool encrypting, Lisp_Object cipher,
if (SYMBOLP (cipher))
{
- info = Fassq (cipher, Fgnutls_ciphers ());
+ if (NILP (cipher_cache))
+ cipher_cache = Fgnutls_ciphers ();
+ info = Fassq (cipher, cipher_cache);
if (!CONSP (info))
xsignal2 (Qerror,
build_string ("GnuTLS cipher is invalid or not found"),
@@ -2914,6 +2918,9 @@ level in the ones. For builds without libgnutls, the value is -1. */);
defsubr (&Sgnutls_hash_digest);
defsubr (&Sgnutls_symmetric_encrypt);
defsubr (&Sgnutls_symmetric_decrypt);
+
+ cipher_cache = Qnil;
+ staticpro (&cipher_cache);
#endif
DEFVAR_INT ("gnutls-log-level", global_gnutls_log_level,
diff --git a/src/gtkutil.c b/src/gtkutil.c
index 1fe160acca9..fafd94c0f71 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -5113,7 +5113,7 @@ update_frame_tool_bar (struct frame *f)
else
idx = -1;
- img_id = lookup_image (f, image);
+ img_id = lookup_image (f, image, -1);
img = IMAGE_FROM_ID (f, img_id);
prepare_image_for_display (f, img);
diff --git a/src/image.c b/src/image.c
index 123de54ba27..35c5946c72f 100644
--- a/src/image.c
+++ b/src/image.c
@@ -758,10 +758,10 @@ struct image_type
/* Load IMG which is used on frame F from information contained in
IMG->spec. Value is true if successful. */
- bool (*load) (struct frame *f, struct image *img);
+ bool (*load_img) (struct frame *f, struct image *img);
/* Free resources of image IMG which is used on frame F. */
- void (*free) (struct frame *f, struct image *img);
+ void (*free_img) (struct frame *f, struct image *img);
#ifdef WINDOWSNT
/* Initialization function (used for dynamic loading of image
@@ -1081,7 +1081,7 @@ calling this function. */)
if (valid_image_p (spec))
{
struct frame *f = decode_window_system_frame (frame);
- ptrdiff_t id = lookup_image (f, spec);
+ ptrdiff_t id = lookup_image (f, spec, -1);
struct image *img = IMAGE_FROM_ID (f, id);
int width = img->width + 2 * img->hmargin;
int height = img->height + 2 * img->vmargin;
@@ -1111,7 +1111,7 @@ or omitted means use the selected frame. */)
if (valid_image_p (spec))
{
struct frame *f = decode_window_system_frame (frame);
- ptrdiff_t id = lookup_image (f, spec);
+ ptrdiff_t id = lookup_image (f, spec, -1);
struct image *img = IMAGE_FROM_ID (f, id);
if (img->mask)
mask = Qt;
@@ -1134,7 +1134,7 @@ or omitted means use the selected frame. */)
if (valid_image_p (spec))
{
struct frame *f = decode_window_system_frame (frame);
- ptrdiff_t id = lookup_image (f, spec);
+ ptrdiff_t id = lookup_image (f, spec, -1);
struct image *img = IMAGE_FROM_ID (f, id);
ext = img->lisp_data;
}
@@ -1197,13 +1197,8 @@ free_image (struct frame *f, struct image *img)
XRenderFreePicture (FRAME_X_DISPLAY (f), img->mask_picture);
#endif
- /* Windows NT redefines 'free', but in this file, we need to
- avoid the redefinition. */
-#ifdef WINDOWSNT
-#undef free
-#endif
/* Free resources, then free IMG. */
- img->type->free (f, img);
+ img->type->free_img (f, img);
xfree (img);
}
}
@@ -1249,7 +1244,7 @@ prepare_image_for_display (struct frame *f, struct image *img)
/* If IMG doesn't have a pixmap yet, load it now, using the image
type dependent loader function. */
if (img->pixmap == NO_PIXMAP && !img->load_failed_p)
- img->load_failed_p = ! img->type->load (f, img);
+ img->load_failed_p = ! img->type->load_img (f, img);
#ifdef USE_CAIRO
if (!img->load_failed_p)
@@ -1266,7 +1261,7 @@ prepare_image_for_display (struct frame *f, struct image *img)
if (img->cr_data == NULL)
{
img->load_failed_p = 1;
- img->type->free (f, img);
+ img->type->free_img (f, img);
}
}
unblock_input ();
@@ -1611,7 +1606,9 @@ equal_lists (Lisp_Object a, Lisp_Object b)
/* Find an image matching SPEC in the cache, and return it. If no
image is found, return NULL. */
static struct image *
-search_image_cache (struct frame *f, Lisp_Object spec, EMACS_UINT hash)
+search_image_cache (struct frame *f, Lisp_Object spec, EMACS_UINT hash,
+ unsigned long foreground, unsigned long background,
+ bool ignore_colors)
{
struct image *img;
struct image_cache *c = FRAME_IMAGE_CACHE (f);
@@ -1634,8 +1631,8 @@ search_image_cache (struct frame *f, Lisp_Object spec, EMACS_UINT hash)
for (img = c->buckets[i]; img; img = img->next)
if (img->hash == hash
&& equal_lists (img->spec, spec)
- && img->frame_foreground == FRAME_FOREGROUND_PIXEL (f)
- && img->frame_background == FRAME_BACKGROUND_PIXEL (f))
+ && (ignore_colors || (img->face_foreground == foreground
+ && img->face_background == background)))
break;
return img;
}
@@ -1646,8 +1643,13 @@ search_image_cache (struct frame *f, Lisp_Object spec, EMACS_UINT hash)
static void
uncache_image (struct frame *f, Lisp_Object spec)
{
- struct image *img = search_image_cache (f, spec, sxhash (spec));
- if (img)
+ struct image *img;
+
+ /* Because the background colors are based on the current face, we
+ can have multiple copies of an image with the same spec. We want
+ to remove them all to ensure the user doesn't see an old version
+ of the image when the face changes. */
+ while ((img = search_image_cache (f, spec, sxhash (spec), 0, 0, true)))
{
free_image (f, img);
/* As display glyphs may still be referring to the image ID, we
@@ -2133,7 +2135,17 @@ image_set_transform (struct frame *f, struct image *img)
/* Determine size. */
int width, height;
- compute_image_size (img->width, img->height, img->spec, &width, &height);
+
+#ifdef HAVE_RSVG
+ /* SVGs are pre-scaled to the correct size. */
+ if (EQ (image_spec_value (img->spec, QCtype, NULL), Qsvg))
+ {
+ width = img->width;
+ height = img->height;
+ }
+ else
+#endif
+ compute_image_size (img->width, img->height, img->spec, &width, &height);
/* Determine rotation. */
double rotation = 0.0;
@@ -2312,11 +2324,16 @@ image_set_transform (struct frame *f, struct image *img)
SPEC must be a valid Lisp image specification (see valid_image_p). */
ptrdiff_t
-lookup_image (struct frame *f, Lisp_Object spec)
+lookup_image (struct frame *f, Lisp_Object spec, int face_id)
{
struct image *img;
EMACS_UINT hash;
+ struct face *face = (face_id >= 0) ? FACE_FROM_ID (f, face_id)
+ : FACE_FROM_ID (f, DEFAULT_FACE_ID);
+ unsigned long foreground = FACE_COLOR_TO_PIXEL (face->foreground, f);
+ unsigned long background = FACE_COLOR_TO_PIXEL (face->background, f);
+
/* F must be a window-system frame, and SPEC must be a valid image
specification. */
eassert (FRAME_WINDOW_P (f));
@@ -2324,7 +2341,7 @@ lookup_image (struct frame *f, Lisp_Object spec)
/* Look up SPEC in the hash table of the image cache. */
hash = sxhash (spec);
- img = search_image_cache (f, spec, hash);
+ img = search_image_cache (f, spec, hash, foreground, background, true);
if (img && img->load_failed_p)
{
free_image (f, img);
@@ -2337,9 +2354,9 @@ lookup_image (struct frame *f, Lisp_Object spec)
block_input ();
img = make_image (spec, hash);
cache_image (f, img);
- img->load_failed_p = ! img->type->load (f, img);
- img->frame_foreground = FRAME_FOREGROUND_PIXEL (f);
- img->frame_background = FRAME_BACKGROUND_PIXEL (f);
+ img->face_foreground = foreground;
+ img->face_background = background;
+ img->load_failed_p = ! img->type->load_img (f, img);
/* If we can't load the image, and we don't have a width and
height, use some arbitrary width and height so that we can
@@ -2393,8 +2410,7 @@ lookup_image (struct frame *f, Lisp_Object spec)
if (!NILP (bg))
{
img->background
- = image_alloc_image_color (f, img, bg,
- FRAME_BACKGROUND_PIXEL (f));
+ = image_alloc_image_color (f, img, bg, background);
img->background_valid = 1;
}
}
@@ -3667,8 +3683,8 @@ xbm_load_image (struct frame *f, struct image *img, char *contents, char *end)
&data, 0);
if (rc)
{
- unsigned long foreground = FRAME_FOREGROUND_PIXEL (f);
- unsigned long background = FRAME_BACKGROUND_PIXEL (f);
+ unsigned long foreground = img->face_foreground;
+ unsigned long background = img->face_background;
bool non_default_colors = 0;
Lisp_Object value;
@@ -3764,8 +3780,8 @@ xbm_load (struct frame *f, struct image *img)
{
struct image_keyword fmt[XBM_LAST];
Lisp_Object data;
- unsigned long foreground = FRAME_FOREGROUND_PIXEL (f);
- unsigned long background = FRAME_BACKGROUND_PIXEL (f);
+ unsigned long foreground = img->face_foreground;
+ unsigned long background = img->face_background;
bool non_default_colors = 0;
char *bits;
bool parsed_p;
@@ -6125,8 +6141,8 @@ pbm_load (struct frame *f, struct image *img)
unsigned char c = 0;
int g;
struct image_keyword fmt[PBM_LAST];
- unsigned long fg = FRAME_FOREGROUND_PIXEL (f);
- unsigned long bg = FRAME_BACKGROUND_PIXEL (f);
+ unsigned long fg = img->face_foreground;
+ unsigned long bg = img->face_background;
/* Parse the image specification. */
memcpy (fmt, pbm_format, sizeof fmt);
parse_image_spec (img->spec, fmt, PBM_LAST, Qpbm);
@@ -9433,6 +9449,7 @@ enum svg_keyword_index
SVG_ALGORITHM,
SVG_HEURISTIC_MASK,
SVG_MASK,
+ SVG_FOREGROUND,
SVG_BACKGROUND,
SVG_LAST
};
@@ -9451,6 +9468,7 @@ static const struct image_keyword svg_format[SVG_LAST] =
{":conversion", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
+ {":foreground", IMAGE_STRING_OR_NIL_VALUE, 0},
{":background", IMAGE_STRING_OR_NIL_VALUE, 0}
};
@@ -9715,6 +9733,8 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
int height;
const guint8 *pixels;
int rowstride;
+ char *wrapped_contents = NULL;
+ ptrdiff_t wrapped_size;
#if ! GLIB_CHECK_VERSION (2, 36, 0)
/* g_type_init is a glib function that must be called prior to
@@ -9722,6 +9742,8 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
g_type_init ();
#endif
+ /* Parse the unmodified SVG data so we can get its initial size. */
+
#if LIBRSVG_CHECK_VERSION (2, 32, 0)
GInputStream *input_stream
= g_memory_input_stream_new_from_data (contents, size, NULL);
@@ -9750,6 +9772,105 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
rsvg_handle_write (rsvg_handle, (unsigned char *) contents, size, &err);
if (err) goto rsvg_error;
+ /* The parsing is complete, rsvg_handle is ready to be used, close
+ it for further writes. */
+ rsvg_handle_close (rsvg_handle, &err);
+ if (err) goto rsvg_error;
+#endif
+
+ /* Get the image dimensions. */
+ rsvg_handle_get_dimensions (rsvg_handle, &dimension_data);
+
+ /* We are now done with the unmodified data. */
+ g_object_unref (rsvg_handle);
+
+ /* Calculate the final image size. */
+ compute_image_size (dimension_data.width, dimension_data.height,
+ img->spec, &width, &height);
+
+ /* Wrap the SVG data in another SVG. This allows us to set the
+ width and height, as well as modify the foreground and background
+ colors. */
+ {
+ Lisp_Object value;
+ unsigned long foreground = img->face_foreground;
+ unsigned long background = img->face_background;
+
+ Lisp_Object encoded_contents
+ = Fbase64_encode_string (make_unibyte_string (contents, size), Qt);
+
+ /* The wrapper sets the foreground color, width and height, and
+ viewBox must contain the dimensions of the original image. It
+ also draws a rectangle over the whole space, set to the
+ background color, before including the original image. This
+ acts to set the background color, instead of leaving it
+ transparent. */
+ const char *wrapper =
+ "<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" "
+ "xmlns:xi=\"http://www.w3.org/2001/XInclude\" "
+ "style=\"color: #%06X; fill: currentColor;\" "
+ "width=\"%d\" height=\"%d\" preserveAspectRatio=\"none\" "
+ "viewBox=\"0 0 %d %d\">"
+ "<rect width=\"100%%\" height=\"100%%\" fill=\"#%06X\"/>"
+ "<xi:include href=\"data:image/svg+xml;base64,%s\"></xi:include>"
+ "</svg>";
+
+ /* FIXME: I've added 64 in the hope it will cover the size of the
+ width and height strings and things. */
+ int buffer_size = SBYTES (encoded_contents) + strlen (wrapper) + 64;
+
+ value = image_spec_value (img->spec, QCforeground, NULL);
+ if (!NILP (value))
+ foreground = image_alloc_image_color (f, img, value, img->face_foreground);
+ value = image_spec_value (img->spec, QCbackground, NULL);
+ if (!NILP (value))
+ {
+ background = image_alloc_image_color (f, img, value, img->face_background);
+ img->background = background;
+ img->background_valid = 1;
+ }
+
+ wrapped_contents = malloc (buffer_size);
+
+ if (!wrapped_contents
+ || buffer_size <= snprintf (wrapped_contents, buffer_size, wrapper,
+ foreground & 0xFFFFFF, width, height,
+ dimension_data.width, dimension_data.height,
+ background & 0xFFFFFF, SSDATA (encoded_contents)))
+ goto rsvg_error;
+
+ wrapped_size = strlen (wrapped_contents);
+ }
+
+ /* Now we parse the wrapped version. */
+
+#if LIBRSVG_CHECK_VERSION (2, 32, 0)
+ input_stream = g_memory_input_stream_new_from_data (wrapped_contents, wrapped_size, NULL);
+ base_file = filename ? g_file_new_for_path (filename) : NULL;
+ rsvg_handle = rsvg_handle_new_from_stream_sync (input_stream, base_file,
+ RSVG_HANDLE_FLAGS_NONE,
+ NULL, &err);
+ if (base_file)
+ g_object_unref (base_file);
+ g_object_unref (input_stream);
+
+ /* Check rsvg_handle too, to avoid librsvg 2.40.13 bug (Bug#36773#26). */
+ if (!rsvg_handle || err) goto rsvg_error;
+#else
+ /* Make a handle to a new rsvg object. */
+ rsvg_handle = rsvg_handle_new ();
+ eassume (rsvg_handle);
+
+ /* Set base_uri for properly handling referenced images (via 'href').
+ See rsvg bug 596114 - "image refs are relative to curdir, not .svg file"
+ <https://gitlab.gnome.org/GNOME/librsvg/issues/33>. */
+ if (filename)
+ rsvg_handle_set_base_uri (rsvg_handle, filename);
+
+ /* Parse the contents argument and fill in the rsvg_handle. */
+ rsvg_handle_write (rsvg_handle, (unsigned char *) wrapped_contents, wrapped_size, &err);
+ if (err) goto rsvg_error;
+
/* The parsing is complete, rsvg_handle is ready to used, close it
for further writes. */
rsvg_handle_close (rsvg_handle, &err);
@@ -9768,6 +9889,7 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
pixbuf = rsvg_handle_get_pixbuf (rsvg_handle);
if (!pixbuf) goto rsvg_error;
g_object_unref (rsvg_handle);
+ free (wrapped_contents);
/* Extract some meta data from the svg handle. */
width = gdk_pixbuf_get_width (pixbuf);
@@ -9792,25 +9914,6 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
init_color_table ();
- /* Handle alpha channel by combining the image with a background
- color. */
- Emacs_Color background;
- Lisp_Object specified_bg = image_spec_value (img->spec, QCbackground, NULL);
- if (!STRINGP (specified_bg)
- || !FRAME_TERMINAL (f)->defined_color_hook (f,
- SSDATA (specified_bg),
- &background,
- false,
- false))
- FRAME_TERMINAL (f)->query_frame_background_color (f, &background);
-
- /* SVG pixmaps specify transparency in the last byte, so right
- shift 8 bits to get rid of it, since emacs doesn't support
- transparency. */
- background.red >>= 8;
- background.green >>= 8;
- background.blue >>= 8;
-
/* This loop handles opacity values, since Emacs assumes
non-transparent images. Each pixel must be "flattened" by
calculating the resulting color, given the transparency of the
@@ -9822,16 +9925,11 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
int red = *pixels++;
int green = *pixels++;
int blue = *pixels++;
- int opacity = *pixels++;
- red = ((red * opacity)
- + (background.red * ((1 << 8) - opacity)));
- green = ((green * opacity)
- + (background.green * ((1 << 8) - opacity)));
- blue = ((blue * opacity)
- + (background.blue * ((1 << 8) - opacity)));
+ /* Skip opacity. */
+ pixels++;
- PUT_PIXEL (ximg, x, y, lookup_rgb_color (f, red, green, blue));
+ PUT_PIXEL (ximg, x, y, lookup_rgb_color (f, red << 8, green << 8, blue << 8));
}
pixels += rowstride - 4 * width;
@@ -9861,6 +9959,8 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
rsvg_error:
if (rsvg_handle)
g_object_unref (rsvg_handle);
+ if (wrapped_contents)
+ free (wrapped_contents);
/* FIXME: Use error->message so the user knows what is the actual
problem with the image. */
image_error ("Error parsing SVG image `%s'", img->spec);
@@ -10159,7 +10259,7 @@ DEFUN ("lookup-image", Flookup_image, Slookup_image, 1, 1, 0,
ptrdiff_t id = -1;
if (valid_image_p (spec))
- id = lookup_image (SELECTED_FRAME (), spec);
+ id = lookup_image (SELECTED_FRAME (), spec, -1);
debug_print (spec);
return make_fixnum (id);
diff --git a/src/keymap.c b/src/keymap.c
index d98b27b7a1b..0608bdddeea 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -3277,7 +3277,7 @@ describe_map (Lisp_Object map, Lisp_Object prefix,
ptrdiff_t pt = max (PT - 1, BEG);
SET_PT (pt);
- insert_string ("\n (that binding is currently shadowed by another mode)");
+ insert_string ("\n (this binding is currently shadowed)");
pt = min (PT + 1, Z);
SET_PT (pt);
}
diff --git a/src/nsmenu.m b/src/nsmenu.m
index b7e4cbd5654..e313fc03f40 100644
--- a/src/nsmenu.m
+++ b/src/nsmenu.m
@@ -1092,7 +1092,7 @@ update_frame_tool_bar (struct frame *f)
continue;
}
- img_id = lookup_image (f, image);
+ img_id = lookup_image (f, image, -1);
img = IMAGE_FROM_ID (f, img_id);
prepare_image_for_display (f, img);
diff --git a/src/regex-emacs.c b/src/regex-emacs.c
index c44cce9f787..971a5f63749 100644
--- a/src/regex-emacs.c
+++ b/src/regex-emacs.c
@@ -929,7 +929,7 @@ typedef struct
? 0 \
: ((fail_stack).stack \
= REGEX_REALLOCATE ((fail_stack).stack, \
- (fail_stack).size * sizeof (fail_stack_elt_t), \
+ (fail_stack).avail * sizeof (fail_stack_elt_t), \
min (emacs_re_max_failures * TYPICAL_FAILURE_SIZE, \
((fail_stack).size * FAIL_STACK_GROWTH_FACTOR)) \
* sizeof (fail_stack_elt_t)), \
@@ -969,7 +969,11 @@ typedef struct
#define ENSURE_FAIL_STACK(space) \
while (REMAINING_AVAIL_SLOTS <= space) { \
if (!GROW_FAIL_STACK (fail_stack)) \
- return -2; \
+ { \
+ unbind_to (count, Qnil); \
+ SAFE_FREE (); \
+ return -2; \
+ } \
DEBUG_PRINT ("\n Doubled stack; size now: %td\n", fail_stack.size); \
DEBUG_PRINT (" slots available: %td\n", REMAINING_AVAIL_SLOTS);\
}
@@ -979,6 +983,8 @@ while (REMAINING_AVAIL_SLOTS <= space) { \
do { \
char *destination; \
intptr_t n = num; \
+ eassert (0 < n && n < num_regs); \
+ eassert (REG_UNSET (regstart[n]) <= REG_UNSET (regend[n])); \
ENSURE_FAIL_STACK(3); \
DEBUG_PRINT (" Push reg %"PRIdPTR" (spanning %p -> %p)\n", \
n, regstart[n], regend[n]); \
@@ -1017,8 +1023,10 @@ do { \
} \
else \
{ \
+ eassert (0 < pfreg && pfreg < num_regs); \
regend[pfreg] = POP_FAILURE_POINTER (); \
regstart[pfreg] = POP_FAILURE_POINTER (); \
+ eassert (REG_UNSET (regstart[pfreg]) <= REG_UNSET (regend[pfreg])); \
DEBUG_PRINT (" Pop reg %ld (spanning %p -> %p)\n", \
pfreg, regstart[pfreg], regend[pfreg]); \
} \
@@ -3864,6 +3872,10 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
re_char *string2, ptrdiff_t size2,
ptrdiff_t pos, struct re_registers *regs, ptrdiff_t stop)
{
+ eassume (0 <= size1);
+ eassume (0 <= size2);
+ eassume (0 <= pos && pos <= stop && stop <= size1 + size2);
+
/* General temporaries. */
int mcnt;
@@ -3919,8 +3931,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
attempt) by a subexpression part of the pattern, that is, the
regnum-th regstart pointer points to where in the pattern we began
matching and the regnum-th regend points to right after where we
- stopped matching the regnum-th subexpression. (The zeroth register
- keeps track of what the whole pattern matches.) */
+ stopped matching the regnum-th subexpression. */
re_char **regstart UNINIT, **regend UNINIT;
/* The following record the register info as found in the above
@@ -3969,29 +3980,22 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
/* Do not bother to initialize all the register variables if there are
no groups in the pattern, as it takes a fair amount of time. If
there are groups, we include space for register 0 (the whole
- pattern), even though we never use it, since it simplifies the
- array indexing. We should fix this. */
- if (bufp->re_nsub)
+ pattern) in REGSTART[0], even though we never use it, to avoid
+ the undefined behavior of subtracting 1 from REGSTART. */
+ ptrdiff_t re_nsub = num_regs - 1;
+ if (0 < re_nsub)
{
- regstart = SAFE_ALLOCA (num_regs * 4 * sizeof *regstart);
+ regstart = SAFE_ALLOCA ((re_nsub * 4 + 1) * sizeof *regstart);
regend = regstart + num_regs;
- best_regstart = regend + num_regs;
- best_regend = best_regstart + num_regs;
- }
+ best_regstart = regend + re_nsub;
+ best_regend = best_regstart + re_nsub;
- /* The starting position is bogus. */
- if (pos < 0 || pos > size1 + size2)
- {
- unbind_to (count, Qnil);
- SAFE_FREE ();
- return -1;
+ /* Initialize subexpression text positions to unset, to mark ones
+ that no start_memory/stop_memory has been seen for. */
+ for (re_char **apos = regstart + 1; apos < best_regstart + 1; apos++)
+ *apos = NULL;
}
- /* Initialize subexpression text positions to -1 to mark ones that no
- start_memory/stop_memory has been seen for. */
- for (ptrdiff_t reg = 1; reg < num_regs; reg++)
- regstart[reg] = regend[reg] = NULL;
-
/* We move 'string1' into 'string2' if the latter's empty -- but not if
'string1' is null. */
if (size2 == 0 && string1 != NULL)
@@ -4126,6 +4130,8 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
{
regstart[reg] = best_regstart[reg];
regend[reg] = best_regend[reg];
+ eassert (REG_UNSET (regstart[reg])
+ <= REG_UNSET (regend[reg]));
}
}
} /* d != end_match_2 */
@@ -4173,7 +4179,9 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
for (ptrdiff_t reg = 1; reg < num_regs; reg++)
{
- if (REG_UNSET (regstart[reg]) || REG_UNSET (regend[reg]))
+ eassert (REG_UNSET (regstart[reg])
+ <= REG_UNSET (regend[reg]));
+ if (REG_UNSET (regend[reg]))
regs->start[reg] = regs->end[reg] = -1;
else
{
@@ -4373,12 +4381,12 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
registers data structure) under the register number. */
case start_memory:
DEBUG_PRINT ("EXECUTING start_memory %d:\n", *p);
+ eassert (0 < *p && *p < num_regs);
/* In case we need to undo this operation (via backtracking). */
PUSH_FAILURE_REG (*p);
regstart[*p] = d;
- regend[*p] = NULL; /* probably unnecessary. -sm */
DEBUG_PRINT (" regstart: %td\n", POINTER_TO_OFFSET (regstart[*p]));
/* Move past the register number and inner group count. */
@@ -4391,6 +4399,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
case stop_memory:
DEBUG_PRINT ("EXECUTING stop_memory %d:\n", *p);
+ eassert (0 < *p && *p < num_regs);
eassert (!REG_UNSET (regstart[*p]));
/* Strictly speaking, there should be code such as:
@@ -4423,7 +4432,9 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
DEBUG_PRINT ("EXECUTING duplicate %d.\n", regno);
/* Can't back reference a group which we've never matched. */
- if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
+ eassert (0 < regno && regno < num_regs);
+ eassert (REG_UNSET (regstart[regno]) <= REG_UNSET (regend[regno]));
+ if (REG_UNSET (regend[regno]))
goto fail;
/* Where in input to try to start matching. */
diff --git a/src/syntax.c b/src/syntax.c
index 9f77ea5f9b0..7f0fc341f6e 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -807,7 +807,7 @@ back_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop,
/* Ignore escaped characters, except comment-enders which cannot
be escaped. */
- if ((Vcomment_end_can_be_escaped || code != Sendcomment)
+ if ((comment_end_can_be_escaped || code != Sendcomment)
&& char_quoted (from, from_byte))
continue;
@@ -2336,7 +2336,7 @@ forw_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop,
&& SYNTAX_FLAGS_COMMENT_STYLE (syntax, 0) == style
&& (SYNTAX_FLAGS_COMMENT_NESTED (syntax) ?
(nesting > 0 && --nesting == 0) : nesting < 0)
- && !(Vcomment_end_can_be_escaped && char_quoted (from, from_byte)))
+ && !(comment_end_can_be_escaped && char_quoted (from, from_byte)))
/* We have encountered a comment end of the same style
as the comment sequence which began this comment
section. */
@@ -2569,7 +2569,7 @@ between them, return t; otherwise return nil. */)
}
else if (code == Sendcomment)
{
- found = (!quoted || !Vcomment_end_can_be_escaped)
+ found = (!quoted || !comment_end_can_be_escaped)
&& back_comment (from, from_byte, stop, comnested, comstyle,
&out_charpos, &out_bytepos);
if (!found)
@@ -3760,9 +3760,9 @@ character of that word.
In both cases, LIMIT bounds the search. */);
Vfind_word_boundary_function_table = Fmake_char_table (Qnil, Qnil);
- DEFVAR_BOOL ("comment-end-can-be-escaped", Vcomment_end_can_be_escaped,
+ DEFVAR_BOOL ("comment-end-can-be-escaped", comment_end_can_be_escaped,
doc: /* Non-nil means an escaped ender inside a comment doesn't end the comment. */);
- Vcomment_end_can_be_escaped = 0;
+ comment_end_can_be_escaped = false;
DEFSYM (Qcomment_end_can_be_escaped, "comment-end-can-be-escaped");
Fmake_variable_buffer_local (Qcomment_end_can_be_escaped);
diff --git a/src/sysdep.c b/src/sysdep.c
index a1050c4309a..e161172a79b 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -1761,24 +1761,6 @@ deliver_thread_signal (int sig, signal_handler_t handler)
errno = old_errno;
}
-#if !HAVE_DECL_SYS_SIGLIST
-# undef sys_siglist
-# ifdef _sys_siglist
-# define sys_siglist _sys_siglist
-# elif HAVE_DECL___SYS_SIGLIST
-# define sys_siglist __sys_siglist
-# else
-# define sys_siglist my_sys_siglist
-static char const *sys_siglist[NSIG];
-# endif
-#endif
-
-#ifdef _sys_nsig
-# define sys_siglist_entries _sys_nsig
-#else
-# define sys_siglist_entries NSIG
-#endif
-
/* Handle bus errors, invalid instruction, etc. */
static void
handle_fatal_signal (int sig)
@@ -1970,143 +1952,6 @@ init_signals (void)
main_thread_id = pthread_self ();
#endif
-#if !HAVE_DECL_SYS_SIGLIST && !defined _sys_siglist
- if (! initialized)
- {
- sys_siglist[SIGABRT] = "Aborted";
-# ifdef SIGAIO
- sys_siglist[SIGAIO] = "LAN I/O interrupt";
-# endif
- sys_siglist[SIGALRM] = "Alarm clock";
-# ifdef SIGBUS
- sys_siglist[SIGBUS] = "Bus error";
-# endif
-# ifdef SIGCHLD
- sys_siglist[SIGCHLD] = "Child status changed";
-# endif
-# ifdef SIGCONT
- sys_siglist[SIGCONT] = "Continued";
-# endif
-# ifdef SIGDANGER
- sys_siglist[SIGDANGER] = "Swap space dangerously low";
-# endif
-# ifdef SIGDGNOTIFY
- sys_siglist[SIGDGNOTIFY] = "Notification message in queue";
-# endif
-# ifdef SIGEMT
- sys_siglist[SIGEMT] = "Emulation trap";
-# endif
- sys_siglist[SIGFPE] = "Arithmetic exception";
-# ifdef SIGFREEZE
- sys_siglist[SIGFREEZE] = "SIGFREEZE";
-# endif
-# ifdef SIGGRANT
- sys_siglist[SIGGRANT] = "Monitor mode granted";
-# endif
- sys_siglist[SIGHUP] = "Hangup";
- sys_siglist[SIGILL] = "Illegal instruction";
- sys_siglist[SIGINT] = "Interrupt";
-# ifdef SIGIO
- sys_siglist[SIGIO] = "I/O possible";
-# endif
-# ifdef SIGIOINT
- sys_siglist[SIGIOINT] = "I/O intervention required";
-# endif
-# ifdef SIGIOT
- sys_siglist[SIGIOT] = "IOT trap";
-# endif
- sys_siglist[SIGKILL] = "Killed";
-# ifdef SIGLOST
- sys_siglist[SIGLOST] = "Resource lost";
-# endif
-# ifdef SIGLWP
- sys_siglist[SIGLWP] = "SIGLWP";
-# endif
-# ifdef SIGMSG
- sys_siglist[SIGMSG] = "Monitor mode data available";
-# endif
-# ifdef SIGPHONE
- sys_siglist[SIGWIND] = "SIGPHONE";
-# endif
- sys_siglist[SIGPIPE] = "Broken pipe";
-# ifdef SIGPOLL
- sys_siglist[SIGPOLL] = "Pollable event occurred";
-# endif
-# ifdef SIGPROF
- sys_siglist[SIGPROF] = "Profiling timer expired";
-# endif
-# ifdef SIGPTY
- sys_siglist[SIGPTY] = "PTY I/O interrupt";
-# endif
-# ifdef SIGPWR
- sys_siglist[SIGPWR] = "Power-fail restart";
-# endif
- sys_siglist[SIGQUIT] = "Quit";
-# ifdef SIGRETRACT
- sys_siglist[SIGRETRACT] = "Need to relinquish monitor mode";
-# endif
-# ifdef SIGSAK
- sys_siglist[SIGSAK] = "Secure attention";
-# endif
- sys_siglist[SIGSEGV] = "Segmentation violation";
-# ifdef SIGSOUND
- sys_siglist[SIGSOUND] = "Sound completed";
-# endif
-# ifdef SIGSTOP
- sys_siglist[SIGSTOP] = "Stopped (signal)";
-# endif
-# ifdef SIGSTP
- sys_siglist[SIGSTP] = "Stopped (user)";
-# endif
-# ifdef SIGSYS
- sys_siglist[SIGSYS] = "Bad argument to system call";
-# endif
- sys_siglist[SIGTERM] = "Terminated";
-# ifdef SIGTHAW
- sys_siglist[SIGTHAW] = "SIGTHAW";
-# endif
-# ifdef SIGTRAP
- sys_siglist[SIGTRAP] = "Trace/breakpoint trap";
-# endif
-# ifdef SIGTSTP
- sys_siglist[SIGTSTP] = "Stopped (user)";
-# endif
-# ifdef SIGTTIN
- sys_siglist[SIGTTIN] = "Stopped (tty input)";
-# endif
-# ifdef SIGTTOU
- sys_siglist[SIGTTOU] = "Stopped (tty output)";
-# endif
-# ifdef SIGURG
- sys_siglist[SIGURG] = "Urgent I/O condition";
-# endif
-# ifdef SIGUSR1
- sys_siglist[SIGUSR1] = "User defined signal 1";
-# endif
-# ifdef SIGUSR2
- sys_siglist[SIGUSR2] = "User defined signal 2";
-# endif
-# ifdef SIGVTALRM
- sys_siglist[SIGVTALRM] = "Virtual timer expired";
-# endif
-# ifdef SIGWAITING
- sys_siglist[SIGWAITING] = "Process's LWPs are blocked";
-# endif
-# ifdef SIGWINCH
- sys_siglist[SIGWINCH] = "Window size changed";
-# endif
-# ifdef SIGWIND
- sys_siglist[SIGWIND] = "SIGWIND";
-# endif
-# ifdef SIGXCPU
- sys_siglist[SIGXCPU] = "CPU time limit exceeded";
-# endif
-# ifdef SIGXFSZ
- sys_siglist[SIGXFSZ] = "File size limit exceeded";
-# endif
- }
-#endif /* !HAVE_DECL_SYS_SIGLIST && !_sys_siglist */
-
/* Don't alter signal handlers if dumping. On some machines,
changing signal handlers sets static data that would make signals
fail to work right when the dumped Emacs is run. */
@@ -2762,15 +2607,13 @@ renameat_noreplace (int srcfd, char const *src, int dstfd, char const *dst)
#endif
}
-/* Like strsignal, except async-signal-safe, and this function typically
+/* Like strsignal, except async-signal-safe, and this function
returns a string in the C locale rather than the current locale. */
char const *
safe_strsignal (int code)
{
- char const *signame = 0;
+ char const *signame = sigdescr_np (code);
- if (0 <= code && code < sys_siglist_entries)
- signame = sys_siglist[code];
if (! signame)
signame = "Unknown signal";
diff --git a/src/window.c b/src/window.c
index ef58f43a0bd..e7433969d29 100644
--- a/src/window.c
+++ b/src/window.c
@@ -5462,7 +5462,7 @@ window_scroll (Lisp_Object window, EMACS_INT n, bool whole, bool noerror)
wset_redisplay (XWINDOW (window));
- if (whole && Vfast_but_imprecise_scrolling)
+ if (whole && fast_but_imprecise_scrolling)
specbind (Qfontification_functions, Qnil);
/* On GUI frames, use the pixel-based version which is much slower
@@ -8398,7 +8398,7 @@ pixelwise even if this option is nil. */);
window_resize_pixelwise = false;
DEFVAR_BOOL ("fast-but-imprecise-scrolling",
- Vfast_but_imprecise_scrolling,
+ fast_but_imprecise_scrolling,
doc: /* When non-nil, accelerate scrolling operations.
This comes into play when scrolling rapidly over previously
unfontified buffer regions. Only those portions of the buffer which
@@ -8406,7 +8406,7 @@ are actually going to be displayed get fontified.
Note that this optimization can cause the portion of the buffer
displayed after a scrolling operation to be somewhat inaccurate. */);
- Vfast_but_imprecise_scrolling = false;
+ fast_but_imprecise_scrolling = false;
defsubr (&Sselected_window);
defsubr (&Sold_selected_window);
diff --git a/src/xdisp.c b/src/xdisp.c
index a1f7706ead2..dd737580438 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -538,7 +538,7 @@ it_char_has_category(struct it *it, int cat)
static bool
char_can_wrap_before (struct it *it)
{
- if (!Vword_wrap_by_category)
+ if (!word_wrap_by_category)
return !IT_DISPLAYING_WHITESPACE (it);
/* For CJK (LTR) text in RTL paragraph, EOL and BOL are flipped.
@@ -560,7 +560,7 @@ char_can_wrap_before (struct it *it)
static bool
char_can_wrap_after (struct it *it)
{
- if (!Vword_wrap_by_category)
+ if (!word_wrap_by_category)
return IT_DISPLAYING_WHITESPACE (it);
/* For CJK (LTR) text in RTL paragraph, EOL and BOL are flipped.
@@ -589,7 +589,7 @@ char_can_wrap_after (struct it *it)
static int
fill_column_indicator_column (struct it *it, int char_width)
{
- if (Vdisplay_fill_column_indicator
+ if (display_fill_column_indicator
&& !it->w->pseudo_window_p
&& it->continuation_lines_width == 0
&& CHARACTERP (Vdisplay_fill_column_indicator_character))
@@ -5771,7 +5771,7 @@ handle_single_display_spec (struct it *it, Lisp_Object spec, Lisp_Object object,
else
{
it->what = IT_IMAGE;
- it->image_id = lookup_image (it->f, value);
+ it->image_id = lookup_image (it->f, value, it->face_id);
it->position = start_pos;
it->object = NILP (object) ? it->w->contents : object;
it->method = GET_FROM_IMAGE;
@@ -12565,6 +12565,11 @@ gui_consider_frame_title (Lisp_Object frame)
display_mode_element (&it, 0, -1, -1, fmt, Qnil, false);
len = MODE_LINE_NOPROP_LEN (title_start);
title = mode_line_noprop_buf + title_start;
+ /* Make sure that any raw bytes in the title are properly
+ represented by their multibyte sequences. */
+ ptrdiff_t nchars = 0;
+ len = str_as_multibyte ((unsigned char *)title,
+ mode_line_noprop_buf_end - title, len, &nchars);
unbind_to (count, Qnil);
/* Set the title only if it's changed. This avoids consing in
@@ -12576,9 +12581,10 @@ gui_consider_frame_title (Lisp_Object frame)
|| SBYTES (f->name) != len
|| memcmp (title, SDATA (f->name), len) != 0)
&& FRAME_TERMINAL (f)->implicit_set_name_hook)
- FRAME_TERMINAL (f)->implicit_set_name_hook (f,
- make_string (title, len),
- Qnil);
+ {
+ Lisp_Object title_string = make_multibyte_string (title, nchars, len);
+ FRAME_TERMINAL (f)->implicit_set_name_hook (f, title_string, Qnil);
+ }
}
}
@@ -21923,7 +21929,7 @@ extend_face_to_end_of_line (struct it *it)
&& !face->stipple
#endif
&& !it->glyph_row->reversed_p
- && !Vdisplay_fill_column_indicator)
+ && !display_fill_column_indicator)
return;
/* Set the glyph row flag indicating that the face of the last glyph
@@ -22517,7 +22523,7 @@ push_prefix_prop (struct it *it, Lisp_Object prop)
else if (IMAGEP (prop))
{
it->what = IT_IMAGE;
- it->image_id = lookup_image (it->f, prop);
+ it->image_id = lookup_image (it->f, prop, it->face_id);
it->method = GET_FROM_IMAGE;
}
#endif /* HAVE_WINDOW_SYSTEM */
@@ -25631,6 +25637,12 @@ display_mode_element (struct it *it, int depth, int field_width, int precision,
spec = decode_mode_spec (it->w, c, field, &string);
eassert (NILP (string) || STRINGP (string));
multibyte = !NILP (string) && STRING_MULTIBYTE (string);
+ /* Non-ASCII characters in SPEC should cause mode-line
+ element be displayed as a multibyte string. */
+ ptrdiff_t nbytes = strlen (spec);
+ if (multibyte_chars_in_text ((const unsigned char *)spec,
+ nbytes) != nbytes)
+ multibyte = true;
switch (mode_line_target)
{
@@ -26249,9 +26261,11 @@ decode_mode_spec_coding (Lisp_Object coding_system, char *buf, bool eol_flag)
attrs = AREF (val, 0);
eolvalue = AREF (val, 2);
- *buf++ = multibyte
- ? XFIXNAT (CODING_ATTR_MNEMONIC (attrs))
- : ' ';
+ if (multibyte)
+ buf += CHAR_STRING (XFIXNAT (CODING_ATTR_MNEMONIC (attrs)),
+ (unsigned char *) buf);
+ else
+ *buf++ = ' ';
if (eol_flag)
{
@@ -27431,7 +27445,7 @@ calc_pixel_width_or_height (double *res, struct it *it, Lisp_Object prop,
if (FRAME_WINDOW_P (it->f)
&& valid_image_p (prop))
{
- ptrdiff_t id = lookup_image (it->f, prop);
+ ptrdiff_t id = lookup_image (it->f, prop, it->face_id);
struct image *img = IMAGE_FROM_ID (it->f, id);
return OK_PIXELS (width_p ? img->width : img->height);
@@ -34758,7 +34772,7 @@ A value of nil means to respect the value of `truncate-lines'.
If `word-wrap' is enabled, you might want to reduce this. */);
Vtruncate_partial_width_windows = make_fixnum (50);
- DEFVAR_BOOL("word-wrap-by-category", Vword_wrap_by_category, doc: /*
+ DEFVAR_BOOL("word-wrap-by-category", word_wrap_by_category, doc: /*
Non-nil means also wrap after characters of a certain category.
Normally when `word-wrap' is on, Emacs only breaks lines after
whitespace characters. When this option is turned on, Emacs also
@@ -34773,7 +34787,7 @@ when breaking lines. That means characters with the ">" category
don't appear at the beginning of a line (e.g., FULLWIDTH COMMA), and
characters with the "<" category don't appear at the end of a line
(e.g., LEFT DOUBLE ANGLE BRACKET). */);
- Vword_wrap_by_category = false;
+ word_wrap_by_category = false;
DEFVAR_LISP ("line-number-display-limit", Vline_number_display_limit,
doc: /* Maximum buffer size for which line number should be displayed.
@@ -35170,10 +35184,10 @@ It has no effect when set to 0, or when line numbers are not absolute. */);
DEFSYM (Qdisplay_line_numbers_offset, "display-line-numbers-offset");
Fmake_variable_buffer_local (Qdisplay_line_numbers_offset);
- DEFVAR_BOOL ("display-fill-column-indicator", Vdisplay_fill_column_indicator,
+ DEFVAR_BOOL ("display-fill-column-indicator", display_fill_column_indicator,
doc: /* Non-nil means display the fill column indicator.
See Info node `Displaying Boundaries' for details. */);
- Vdisplay_fill_column_indicator = false;
+ display_fill_column_indicator = false;
DEFSYM (Qdisplay_fill_column_indicator, "display-fill-column-indicator");
Fmake_variable_buffer_local (Qdisplay_fill_column_indicator);
diff --git a/test/data/themes/faces-test-dark-theme.el b/test/data/themes/faces-test-dark-theme.el
index 2eb72d6b358..a5e2ca43627 100644
--- a/test/data/themes/faces-test-dark-theme.el
+++ b/test/data/themes/faces-test-dark-theme.el
@@ -2,18 +2,20 @@
;; Copyright (C) 2019-2020 Free Software Foundation, Inc.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/data/themes/faces-test-light-theme.el b/test/data/themes/faces-test-light-theme.el
index 4a7c7f6877d..b2f7ec69742 100644
--- a/test/data/themes/faces-test-light-theme.el
+++ b/test/data/themes/faces-test-light-theme.el
@@ -2,18 +2,20 @@
;; Copyright (C) 2019-2020 Free Software Foundation, Inc.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/lisp/calendar/todo-mode-resources/todo-test-1.todo b/test/lisp/calendar/todo-mode-resources/todo-test-1.todo
index 557134fd454..2375772fbe7 100644
--- a/test/lisp/calendar/todo-mode-resources/todo-test-1.todo
+++ b/test/lisp/calendar/todo-mode-resources/todo-test-1.todo
@@ -1,8 +1,8 @@
(("testcat1" . [2 0 2 1]) ("testcat2" . [3 0 1 1]) ("testcat3" . [0 0 0 0]) ("testcat4" . [1 0 0 0]))
--==-- testcat1
[May 29, 2017] testcat1 item3
- has more than one line
- to test item highlighting
+ has more than one line
+ to test item highlighting
[Jul 3, 2017] testcat1 item4
==--== DONE
diff --git a/test/lisp/calendar/todo-mode-tests.el b/test/lisp/calendar/todo-mode-tests.el
index a19612ee562..1fbd39478c5 100644
--- a/test/lisp/calendar/todo-mode-tests.el
+++ b/test/lisp/calendar/todo-mode-tests.el
@@ -414,8 +414,15 @@ the top done item should be the first done item."
(should (todo-done-item-p))
(forward-line -1)
(should (looking-at todo-category-done))
- ;; Make sure marked items are no longer in first category.
- (todo-backward-category)
+ ;; Make sure marked items are no longer in first category. Since
+ ;; cat1 now contains no todo or done items but does have archived
+ ;; items, todo-backward-category would skip it by default, so
+ ;; prevent this. (FIXME: Without this let-binding,
+ ;; todo-backward-category selects the nonempty cat4 and this test
+ ;; fails as expected when run interactively but not in a batch
+ ;; run -- why?)
+ (let (todo-skip-archived-categories)
+ (todo-backward-category))
(should (eq (point-min) (point-max))) ; All todo items were moved.
;; This passes when run interactively but fails in a batch run:
;; the message is displayed but (current-message) evaluates to
@@ -848,7 +855,7 @@ should display the previously current (or default) todo file."
(should (equal todo-current-todo-file todo-test-file-1))
(delete-file (concat file "~")))))
-(ert-deftest todo-test-edit-item-date-month ()
+(ert-deftest todo-test-edit-item-date-month () ; bug#42976 #3 and #4
"Test incrementing and decrementing the month of an item's date.
If the change in month crosses a year boundary, the year of the
item's date should be adjusted accordingly."
@@ -892,8 +899,50 @@ item's date should be adjusted accordingly."
(todo-edit-item--header 'month 25)
(should (equal (funcall get-date) "Feb 1, 2022"))
(todo-edit-item--header 'month -25)
- (should (equal (funcall get-date) "Jan 1, 2020"))
- )))
+ (should (equal (funcall get-date) "Jan 1, 2020")))))
+
+(ert-deftest todo-test-multiline-item-indentation-1 ()
+ "Test inserting a multine item containing a hard line break.
+After insertion the second line of the item should begin with a
+tab character."
+ (with-todo-test
+ (let* ((item0 "Test inserting a multine item")
+ (item1 "containing a hard line break.")
+ (item (concat item0 "\n" item1)))
+ (todo-test--show 1)
+ (todo-test--insert-item item 1)
+ (re-search-forward (concat todo-date-string-start todo-date-pattern
+ (regexp-quote todo-nondiary-end) " ")
+ (line-end-position) t)
+ (should (looking-at (regexp-quote (concat item0 "\n\t" item1)))))))
+
+(ert-deftest todo-test-multiline-item-indentation-2 () ; bug#43068
+ "Test editing an item by adding text on a new line.
+After quitting todo-edit-mode the second line of the item should
+begin with a tab character."
+ (with-todo-test
+ (todo-test--show 2)
+ (let* ((item0 (todo-item-string))
+ (item1 "Second line."))
+ (todo-edit-item--text 'multiline)
+ (insert (concat "\n" item1))
+ (todo-edit-quit)
+ (goto-char (line-beginning-position))
+ (should (looking-at (regexp-quote (concat item0 "\n\t" item1)))))))
+
+(ert-deftest todo-test-multiline-item-indentation-3 ()
+ "Test adding an unindented new line to an item using todo-edit-file.
+Attempting to quit todo-edit-mode should signal a user-error,
+since all non-initial item lines must begin with whitespace."
+ (with-todo-test
+ (todo-test--show 2)
+ (let* ((item0 (todo-item-string))
+ (item1 "Second line."))
+ (todo-edit-file)
+ (should (looking-at (regexp-quote item0)))
+ (goto-char (line-end-position))
+ (insert (concat "\n" item1))
+ (should-error (todo-edit-quit) :type 'user-error))))
(provide 'todo-mode-tests)
;;; todo-mode-tests.el ends here
diff --git a/test/lisp/char-fold-tests.el b/test/lisp/char-fold-tests.el
index 0e55dfbb8ed..599d9d614f9 100644
--- a/test/lisp/char-fold-tests.el
+++ b/test/lisp/char-fold-tests.el
@@ -4,18 +4,20 @@
;; Author: Artur Malabarba <bruce.connor.am@gmail.com>
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/lisp/electric-tests.el b/test/lisp/electric-tests.el
index 67f474cbd52..8b9c1c5fcb5 100644
--- a/test/lisp/electric-tests.el
+++ b/test/lisp/electric-tests.el
@@ -5,18 +5,20 @@
;; Author: João Távora <joaotavora@gmail.com>
;; Keywords:
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el b/test/lisp/emacs-lisp/bytecomp-tests.el
index 834e3b6d914..a9dcf152617 100644
--- a/test/lisp/emacs-lisp/bytecomp-tests.el
+++ b/test/lisp/emacs-lisp/bytecomp-tests.el
@@ -354,10 +354,18 @@
'((a c) (b c) (7 c) (-3 c) (nil nil) (t c) (q c) (r c) (s c)
(t c) (x "a") (x "c") (x c) (x d) (x e)))
- ;; `substring' bytecode generation (bug#39709).
- (substring "abcdef")
- (substring "abcdef" 2)
- (substring "abcdef" 3 2))
+ (mapcar (lambda (x) (cond ((member '(a . b) x) 1)
+ ((equal x '(c)) 2)))
+ '(((a . b)) a b (c) (d)))
+ (mapcar (lambda (x) (cond ((memq '(a . b) x) 1)
+ ((equal x '(c)) 2)))
+ '(((a . b)) a b (c) (d)))
+ (mapcar (lambda (x) (cond ((member '(a b) x) 1)
+ ((equal x '(c)) 2)))
+ '(((a b)) a b (c) (d)))
+ (mapcar (lambda (x) (cond ((memq '(a b) x) 1)
+ ((equal x '(c)) 2)))
+ '(((a b)) a b (c) (d))))
"List of expression for test.
Each element will be executed by interpreter and with
bytecompiled code, and their results compared.")
diff --git a/test/lisp/emacs-lisp/rmc-tests.el b/test/lisp/emacs-lisp/rmc-tests.el
index 5dee206e931..5add24c479a 100644
--- a/test/lisp/emacs-lisp/rmc-tests.el
+++ b/test/lisp/emacs-lisp/rmc-tests.el
@@ -5,18 +5,20 @@
;; Author: Tino Calancha <tino.calancha@gmail.com>
;; Keywords:
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/lisp/emacs-lisp/subr-x-tests.el b/test/lisp/emacs-lisp/subr-x-tests.el
index c702fdff6f1..9d14a5ab7ec 100644
--- a/test/lisp/emacs-lisp/subr-x-tests.el
+++ b/test/lisp/emacs-lisp/subr-x-tests.el
@@ -5,18 +5,20 @@
;; Author: Fabián E. Gallina <fgallina@gnu.org>
;; Keywords:
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/lisp/emacs-lisp/text-property-search-tests.el b/test/lisp/emacs-lisp/text-property-search-tests.el
index 549c90d20d8..83d4b95b76b 100644
--- a/test/lisp/emacs-lisp/text-property-search-tests.el
+++ b/test/lisp/emacs-lisp/text-property-search-tests.el
@@ -5,18 +5,20 @@
;; Author: Lars Ingebrigtsen <larsi@gnus.org>
;; Keywords:
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/lisp/emacs-lisp/warnings-tests.el b/test/lisp/emacs-lisp/warnings-tests.el
new file mode 100644
index 00000000000..02c09b41ca5
--- /dev/null
+++ b/test/lisp/emacs-lisp/warnings-tests.el
@@ -0,0 +1,60 @@
+;;; warnings-tests.el --- tests for warnings.el -*- lexical-binding: t; -*-
+
+;; Author: Stefan Kangas <stefankangas@gmail.com>
+
+;; Copyright (C) 2020 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Code:
+
+(require 'ert)
+(require 'warnings)
+
+(ert-deftest test-warning-suppress-p ()
+ (should (warning-suppress-p 'foo '((foo))))
+ (should (warning-suppress-p '(foo bar) '((foo bar))))
+ (should (warning-suppress-p '(foo bar baz) '((foo bar))))
+ (should-not (warning-suppress-p '(foo bar baz) '((foo bax))))
+ (should-not (warning-suppress-p 'foobar nil)))
+
+(ert-deftest test-display-warning ()
+ (dolist (level '(:emergency :error :warning))
+ (with-temp-buffer
+ (display-warning '(foo) "Hello123" level (current-buffer))
+ (should (string-match "foo" (buffer-string)))
+ (should (string-match "Hello123" (buffer-string))))
+ (with-current-buffer "*Messages*"
+ (should (string-match "Hello123" (buffer-string))))))
+
+(ert-deftest test-display-warning/warning-minimum-level ()
+ ;; This test only works interactively:
+ :expected-result :failed
+ (let ((warning-minimum-level :emergency))
+ (with-temp-buffer
+ (display-warning '(foo) "baz" :warning (current-buffer)))
+ (with-current-buffer "*Messages*"
+ (should-not (string-match "baz" (buffer-string))))))
+
+(ert-deftest test-display-warning/warning-minimum-log-level ()
+ (let ((warning-minimum-log-level :error))
+ (with-temp-buffer
+ (display-warning '(foo) "hello" :warning (current-buffer))
+ (should-not (string-match "hello" (buffer-string))))))
+
+(provide 'warnings-tests)
+
+;;; warnings-tests.el ends here
diff --git a/test/lisp/faces-tests.el b/test/lisp/faces-tests.el
index d5dc19349a4..32dc1eea856 100644
--- a/test/lisp/faces-tests.el
+++ b/test/lisp/faces-tests.el
@@ -5,18 +5,20 @@
;; Author: Artur Malabarba <bruce.connor.am@gmail.com>
;; Keywords:
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/lisp/gnus/gnus-icalendar-tests.el b/test/lisp/gnus/gnus-icalendar-tests.el
index 48a9996e7a8..be23c90af37 100644
--- a/test/lisp/gnus/gnus-icalendar-tests.el
+++ b/test/lisp/gnus/gnus-icalendar-tests.el
@@ -38,18 +38,10 @@
(setq event (gnus-icalendar-event-from-buffer (buffer-name) participant)))
event))
-(defun icalendar-tests--get-ical-event (ical-string)
- "Return iCalendar event for ICAL-STRING."
- (save-excursion
- (with-temp-buffer
- (insert ical-string)
- (goto-char (point-min))
- (car (icalendar--read-element nil nil)))))
-
(ert-deftest gnus-icalendar-parse ()
"test"
(let ((tz (getenv "TZ"))
- (event (gnus-icalendar-tests--get-ical-event "
+ (event (gnus-icalendar-tests--get-ical-event "\
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
@@ -83,7 +75,7 @@ UID:iipdt88slddpeu7hheuu09sfmd@google.com
X-MICROSOFT-CDO-OWNERAPPTID:-362490173
RECURRENCE-ID;TZID=America/New_York:20201208T091500
CREATED:20200309T134939Z
-DESCRIPTION:In this meeting\, we will cover topics from product and enginee
+DESCRIPTION:In this meeting\\, we will cover topics from product and enginee
ring presentations and demos to new hire announcements to watching the late
LAST-MODIFIED:20200728T182852Z
LOCATION:New York-22-Town Hall Space (250) [Chrome Box]
@@ -106,7 +98,7 @@ END:VCALENDAR
(with-slots (organizer summary description location end-time uid rsvp participation-type) event
(should (string= organizer "liveintent.com_3bm6fh805bme9uoeliqcle1sag@group.calendar.google.com"))
(should (string= summary "Townhall | All Company Meeting"))
- (should (string= description "In this meeting\, we will cover topics from product and engineering presentations and demos to new hire announcements to watching the late"))
+ (should (string= description "In this meeting, we will cover topics from product and engineering presentations and demos to new hire announcements to watching the late"))
(should (string= location "New York-22-Town Hall Space (250) [Chrome Box]"))
(should (string= (format-time-string "%Y-%m-%d %H:%M" end-time) "2020-12-08 16:00"))
(should (string= uid "iipdt88slddpeu7hheuu09sfmd@google.com"))
@@ -117,7 +109,7 @@ END:VCALENDAR
(ert-deftest gnus-icalendary-byday ()
""
(let ((tz (getenv "TZ"))
- (event (gnus-icalendar-tests--get-ical-event "
+ (event (gnus-icalendar-tests--get-ical-event "\
BEGIN:VCALENDAR
PRODID:Zimbra-Calendar-Provider
VERSION:2.0
@@ -142,7 +134,7 @@ END:VTIMEZONE
BEGIN:VEVENT
UID:903a5415-9067-4f63-b499-1b6205f49c88
RRULE:FREQ=DAILY;UNTIL=20200825T035959Z;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
-SUMMARY:appointment every weekday\, start jul 24\, 2020\, end aug 24\, 2020
+SUMMARY:appointment every weekday\\, start jul 24\\, 2020\\, end aug 24\\, 2020
ATTENDEE;CN=Mark Hershberger;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP
=TRUE:mailto:hexmode <at> gmail.com
ORGANIZER;CN=Mark A. Hershberger:mailto:mah <at> nichework.com
@@ -175,7 +167,7 @@ END:VCALENDAR" (list "Mark Hershberger"))))
(should (string= (gnus-icalendar-event:start event) "2020-07-24 15:00"))
(with-slots (organizer summary description location end-time uid rsvp participation-type) event
(should (string= organizer "mah <at> nichework.com"))
- (should (string= summary "appointment every weekday\, start jul 24\, 2020\, end aug 24\, 2020"))
+ (should (string= summary "appointment every weekday, start jul 24, 2020, end aug 24, 2020"))
(should (string= description "The following is a new meeting request:"))
(should (null location))
(should (string= (format-time-string "%Y-%m-%d %H:%M" end-time) "2020-07-24 15:30"))
diff --git a/test/lisp/gnus/mml-sec-tests.el b/test/lisp/gnus/mml-sec-tests.el
index 07da4bffa5a..673fa6984a1 100644
--- a/test/lisp/gnus/mml-sec-tests.el
+++ b/test/lisp/gnus/mml-sec-tests.el
@@ -37,7 +37,7 @@ Mostly, the empty passphrase is used. However, the keys for
as S/MIME).")
(defun test-conf ()
- (ignore-errors (epg-configuration)))
+ (ignore-errors (epg-find-configuration 'OpenPGP)))
(defun enc-standards ()
(if with-smime '(enc-pgp enc-pgp-mime enc-smime)
@@ -647,6 +647,7 @@ In this test, just multiple encryption and signing keys may be available."
(ert-deftest mml-secure-en-decrypt-sign-1-2-double ()
"Sign and encrypt message; then decrypt and test for expected result.
In this test, just multiple encryption and signing keys may be available."
+ :tags '(:unstable)
(skip-unless (test-conf))
(mml-secure-test-key-fixture
(lambda ()
@@ -842,7 +843,8 @@ So the second decryption fails."
(ert-deftest mml-secure-en-decrypt-passphrase-no-cache-openpgp-todo ()
"Passphrase caching with OpenPGP only for GnuPG 1.x."
(skip-unless (test-conf))
- (skip-unless (string< (cdr (assq 'version (epg-configuration))) "2"))
+ (skip-unless (string< (cdr (assq 'version (epg-find-configuration 'OpenPGP)))
+ "2"))
(mml-secure-en-decrypt-passphrase-no-cache 'enc-pgp)
(mml-secure-en-decrypt-passphrase-no-cache 'enc-pgp-mime))
@@ -884,7 +886,7 @@ So the second decryption fails."
(defun mml-secure-run-tests-with-gpg2 ()
"Run all tests with gpg2 instead of gpg."
(let* ((epg-gpg-program "gpg2"); ~/local/gnupg-2.1.9/PLAY/inst/bin/gpg2
- (gpg-version (cdr (assq 'version (epg-configuration))))
+ (gpg-version (cdr (assq 'version (epg-find-configuration 'OpenPGP))))
;; Empty passphrases do not seem to work with gpgsm in 2.1.x:
;; https://lists.gnupg.org/pipermail/gnupg-users/2015-October/054575.html
(with-smime (string< gpg-version "2.1")))
diff --git a/test/lisp/hi-lock-tests.el b/test/lisp/hi-lock-tests.el
index 59f3e73b17d..d30a6d08001 100644
--- a/test/lisp/hi-lock-tests.el
+++ b/test/lisp/hi-lock-tests.el
@@ -5,18 +5,20 @@
;; Author: Tino Calancha <tino.calancha@gmail.com>
;; Keywords:
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/lisp/isearch-tests.el b/test/lisp/isearch-tests.el
index 3f430ab25f7..516077ac1f8 100644
--- a/test/lisp/isearch-tests.el
+++ b/test/lisp/isearch-tests.el
@@ -4,18 +4,20 @@
;; Author: Artur Malabarba <bruce.connor.am@gmail.com>
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/lisp/json-tests.el b/test/lisp/json-tests.el
index a0e8c87c7b3..8ac454467d3 100644
--- a/test/lisp/json-tests.el
+++ b/test/lisp/json-tests.el
@@ -4,18 +4,20 @@
;; Author: Dmitry Gutov <dgutov@yandex.ru>
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/lisp/jsonrpc-tests.el b/test/lisp/jsonrpc-tests.el
index 6c08023d4f3..168a2c950cf 100644
--- a/test/lisp/jsonrpc-tests.el
+++ b/test/lisp/jsonrpc-tests.el
@@ -5,18 +5,20 @@
;; Author: João Távora <joaotavora@gmail.com>
;; Keywords: tests
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/lisp/mail/footnote-tests.el b/test/lisp/mail/footnote-tests.el
index 79f48072391..6594aa2b3e5 100644
--- a/test/lisp/mail/footnote-tests.el
+++ b/test/lisp/mail/footnote-tests.el
@@ -5,18 +5,20 @@
;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
;; Keywords:
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/lisp/minibuffer-tests.el b/test/lisp/minibuffer-tests.el
index f4c840c1171..5da86f36148 100644
--- a/test/lisp/minibuffer-tests.el
+++ b/test/lisp/minibuffer-tests.el
@@ -5,18 +5,20 @@
;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
;; Keywords:
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index 05196e7e4a6..71c6302e0ee 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -98,6 +98,7 @@
'("mock"
(tramp-login-program "sh")
(tramp-login-args (("-i")))
+ (tramp-direct-async-args (("-c")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-args ("-c"))
(tramp-connection-timeout 10)))
@@ -2023,8 +2024,12 @@ is greater than 10.
"Check `substitute-in-file-name'."
(skip-unless (eq tramp-syntax 'default))
- ;; Suppress method name check.
- (let ((tramp-methods (cons '("method") tramp-methods)))
+ ;; Suppress method name check. We cannot use the string "foo" as
+ ;; user name, because (substitute-in-string "/~foo") returns
+ ;; different values depending on the existence of user "foo" (see
+ ;; Bug#43052).
+ (let ((tramp-methods (cons '("method") tramp-methods))
+ (foo (downcase (md5 (current-time-string)))))
(should
(string-equal (substitute-in-file-name "/method:host:///foo") "/foo"))
(should
@@ -2056,36 +2061,40 @@ is greater than 10.
;; Emacs 25, occasionally. No idea what's up.
(when (tramp--test-emacs26-p)
(should
- (string-equal (substitute-in-file-name "/method:host://~foo") "/~foo"))
+ (string-equal
+ (substitute-in-file-name (concat "/method:host://~" foo))
+ (concat "/~" foo)))
(should
(string-equal
- (substitute-in-file-name "/method:host:/~foo") "/method:host:/~foo"))
+ (substitute-in-file-name (concat "/method:host:/~" foo))
+ (concat "/method:host:/~" foo)))
(should
(string-equal
- (substitute-in-file-name "/method:host:/path//~foo") "/~foo"))
+ (substitute-in-file-name (concat "/method:host:/path//~" foo))
+ (concat "/~" foo)))
;; (substitute-in-file-name "/path/~foo") expands only for a local
;; user "foo" to "/~foo"". Otherwise, it doesn't expand.
(should
(string-equal
- (substitute-in-file-name
- "/method:host:/path/~foo") "/method:host:/path/~foo"))
+ (substitute-in-file-name (concat "/method:host:/path/~" foo))
+ (concat "/method:host:/path/~" foo)))
;; Quoting local part.
(should
(string-equal
- (substitute-in-file-name "/method:host:/://~foo")
- "/method:host:/://~foo"))
+ (substitute-in-file-name (concat "/method:host:/://~" foo))
+ (concat "/method:host:/://~" foo)))
(should
(string-equal
- (substitute-in-file-name
- "/method:host:/:/~foo") "/method:host:/:/~foo"))
+ (substitute-in-file-name (concat "/method:host:/:/~" foo))
+ (concat "/method:host:/:/~" foo)))
(should
(string-equal
- (substitute-in-file-name
- "/method:host:/:/path//~foo") "/method:host:/:/path//~foo"))
+ (substitute-in-file-name (concat "/method:host:/:/path//~" foo))
+ (concat "/method:host:/:/path//~" foo)))
(should
(string-equal
- (substitute-in-file-name
- "/method:host:/:/path/~foo") "/method:host:/:/path/~foo")))
+ (substitute-in-file-name (concat "/method:host:/:/path/~" foo))
+ (concat "/method:host:/:/path/~" foo))))
(let (process-environment)
(should
@@ -2130,16 +2139,19 @@ is greater than 10.
(expand-file-name "/method:host:/path/../file") "/method:host:/file"))
(should
(string-equal
- (expand-file-name "/method:host:/path/.") "/method:host:/path"))
+ (expand-file-name "/method:host:/path/.")
+ (if (tramp--test-emacs28-p) "/method:host:/path/" "/method:host:/path")))
(should
(string-equal
(expand-file-name "/method:host:/path/..") "/method:host:/"))
(should
(string-equal
- (expand-file-name "." "/method:host:/path/") "/method:host:/path"))
+ (expand-file-name "." "/method:host:/path/")
+ (if (tramp--test-emacs28-p) "/method:host:/path/" "/method:host:/path")))
(should
(string-equal
- (expand-file-name "" "/method:host:/path/") "/method:host:/path"))
+ (expand-file-name "" "/method:host:/path/")
+ (if (tramp--test-emacs28-p) "/method:host:/path/" "/method:host:/path")))
;; Quoting local part.
(should
(string-equal
@@ -2154,21 +2166,12 @@ is greater than 10.
"/method:host:/:/~/path/file"))))
;; The following test is inspired by Bug#26911 and Bug#34834. They
-;; are rather bugs in `expand-file-name', and it fails for all Emacs
-;; versions. Test added for later, when they are fixed.
+;; were bugs in `expand-file-name'.
(ert-deftest tramp-test05-expand-file-name-relative ()
"Check `expand-file-name'."
- ;; Mark as failed until bug has been fixed.
- :expected-result :failed
(skip-unless (tramp--test-enabled))
-
- ;; These are the methods the test doesn't fail.
- (when (or (tramp--test-adb-p) (tramp--test-ange-ftp-p) (tramp--test-gvfs-p)
- (tramp--test-rclone-p)
- (tramp--test-smb-p))
- (setf (ert-test-expected-result-type
- (ert-get-test 'tramp-test05-expand-file-name-relative))
- :passed))
+ ;; The bugs are fixed in Emacs 28.1.
+ (skip-unless (tramp--test-emacs28-p))
(should
(string-equal
@@ -3556,7 +3559,7 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
;; `tmp-name3' is a local file name. Therefore, the link
;; target remains unchanged, even if quoted.
;; `make-symbolic-link' might not be permitted on w32 systems.
- (unless (tramp--test-windows-nt)
+ (unless (tramp--test-windows-nt-p)
(make-symbolic-link tmp-name1 tmp-name3)
(should
(string-equal tmp-name1 (file-symlink-p tmp-name3))))
@@ -3670,7 +3673,7 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(concat (file-remote-p tmp-name2) penguin)))))
;; `tmp-name3' is a local file name.
;; `make-symbolic-link' might not be permitted on w32 systems.
- (unless (tramp--test-windows-nt)
+ (unless (tramp--test-windows-nt-p)
(make-symbolic-link tmp-name1 tmp-name3)
(should (file-symlink-p tmp-name3))
(should-not (string-equal tmp-name3 (file-truename tmp-name3)))
@@ -4325,9 +4328,7 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(with-timeout (10 (tramp--test-timeout-handler))
(while (< (- (point-max) (point-min)) (length "foo"))
(while (accept-process-output proc 0 nil t))))
- ;; We cannot use `string-equal', because tramp-adb.el
- ;; echoes also the sent string.
- (should (string-match "\\`foo" (buffer-string))))
+ (should (string-match "foo" (buffer-string))))
;; Cleanup.
(ignore-errors (delete-process proc)))
@@ -4346,7 +4347,7 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(with-timeout (10 (tramp--test-timeout-handler))
(while (< (- (point-max) (point-min)) (length "foo"))
(while (accept-process-output proc 0 nil t))))
- (should (string-equal (buffer-string) "foo")))
+ (should (string-match "foo" (buffer-string))))
;; Cleanup.
(ignore-errors
@@ -4368,13 +4369,35 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(with-timeout (10 (tramp--test-timeout-handler))
(while (< (- (point-max) (point-min)) (length "foo"))
(while (accept-process-output proc 0 nil t))))
- ;; We cannot use `string-equal', because tramp-adb.el
- ;; echoes also the sent string.
- (should (string-match "\\`foo" (buffer-string))))
+ (should (string-match "foo" (buffer-string))))
;; Cleanup.
(ignore-errors (delete-process proc))))))
+(defmacro tramp--test--deftest-direct-async-process
+ (test docstring &optional unstable)
+ "Define ert test `TEST-direct-async' for direct async processes.
+If UNSTABLE is non-nil, the test is tagged as `:unstable'."
+ (declare (indent 1))
+ `(ert-deftest ,(intern (concat (symbol-name test) "-direct-async")) ()
+ ,docstring
+ :tags (if ,unstable '(:expensive-test :unstable) '(:expensive-test))
+ (skip-unless (tramp--test-enabled))
+ (let ((default-directory tramp-test-temporary-file-directory)
+ (ert-test (ert-get-test ',test))
+ (tramp-connection-properties
+ (cons '(nil "direct-async-process" t) tramp-connection-properties)))
+ (skip-unless (tramp-direct-async-process-p))
+ ;; We do expect an established connection already,
+ ;; `file-truename' does it by side-effect. Suppress
+ ;; `tramp--test-enabled', in order to keep the connection.
+ (cl-letf (((symbol-function #'tramp--test-enabled) (lambda nil t)))
+ (file-truename tramp-test-temporary-file-directory)
+ (funcall (ert-test-body ert-test))))))
+
+(tramp--test--deftest-direct-async-process tramp-test29-start-file-process
+ "Check direct async `start-file-process'.")
+
(ert-deftest tramp-test30-make-process ()
"Check `make-process'."
:tags '(:expensive-test)
@@ -4407,9 +4430,7 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(with-timeout (10 (tramp--test-timeout-handler))
(while (< (- (point-max) (point-min)) (length "foo"))
(while (accept-process-output proc 0 nil t))))
- ;; We cannot use `string-equal', because tramp-adb.el
- ;; echoes also the sent string.
- (should (string-match "\\`foo" (buffer-string))))
+ (should (string-match "foo" (buffer-string))))
;; Cleanup.
(ignore-errors (delete-process proc)))
@@ -4430,7 +4451,7 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(with-timeout (10 (tramp--test-timeout-handler))
(while (< (- (point-max) (point-min)) (length "foo"))
(while (accept-process-output proc 0 nil t))))
- (should (string-equal (buffer-string) "foo")))
+ (should (string-match "foo" (buffer-string))))
;; Cleanup.
(ignore-errors
@@ -4456,9 +4477,7 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(with-timeout (10 (tramp--test-timeout-handler))
(while (not (string-match "foo" (buffer-string)))
(while (accept-process-output proc 0 nil t))))
- ;; We cannot use `string-equal', because tramp-adb.el
- ;; echoes also the sent string.
- (should (string-match "\\`foo" (buffer-string))))
+ (should (string-match "foo" (buffer-string))))
;; Cleanup.
(ignore-errors (delete-process proc)))
@@ -4482,10 +4501,6 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
;; Read output.
(with-timeout (10 (tramp--test-timeout-handler))
(while (accept-process-output proc 0 nil t)))
- ;; We cannot use `string-equal', because tramp-adb.el
- ;; echoes also the sent string. And a remote macOS sends
- ;; a slightly modified string. On MS Windows,
- ;; `delete-process' sends an unknown signal.
(should
(string-match
(if (eq system-type 'windows-nt)
@@ -4496,55 +4511,60 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(ignore-errors (delete-process proc)))
;; Process with stderr buffer.
- (let ((stderr (generate-new-buffer "*stderr*")))
- (unwind-protect
- (with-temp-buffer
- (setq proc
- (with-no-warnings
- (make-process
- :name "test5" :buffer (current-buffer)
- :command '("cat" "/does-not-exist")
- :stderr stderr
- :file-handler t)))
- (should (processp proc))
- ;; Read stderr.
- (with-timeout (10 (tramp--test-timeout-handler))
- (while (accept-process-output proc 0 nil t)))
- (delete-process proc)
- (with-current-buffer stderr
- (should
- (string-match
- "cat:.* No such file or directory" (buffer-string)))))
+ (unless (tramp-direct-async-process-p)
+ (let ((stderr (generate-new-buffer "*stderr*")))
+ (unwind-protect
+ (with-temp-buffer
+ (setq proc
+ (with-no-warnings
+ (make-process
+ :name "test5" :buffer (current-buffer)
+ :command '("cat" "/does-not-exist")
+ :stderr stderr
+ :file-handler t)))
+ (should (processp proc))
+ ;; Read stderr.
+ (with-timeout (10 (tramp--test-timeout-handler))
+ (while (accept-process-output proc 0 nil t)))
+ (delete-process proc)
+ (with-current-buffer stderr
+ (should
+ (string-match
+ "cat:.* No such file or directory" (buffer-string)))))
- ;; Cleanup.
- (ignore-errors (delete-process proc))
- (ignore-errors (kill-buffer stderr))))
+ ;; Cleanup.
+ (ignore-errors (delete-process proc))
+ (ignore-errors (kill-buffer stderr)))))
;; Process with stderr file.
- (dolist (tmpfile `(,tmp-name1 ,tmp-name2))
- (unwind-protect
- (with-temp-buffer
- (setq proc
- (with-no-warnings
- (make-process
- :name "test6" :buffer (current-buffer)
- :command '("cat" "/does-not-exist")
- :stderr tmpfile
- :file-handler t)))
- (should (processp proc))
- ;; Read stderr.
- (with-timeout (10 (tramp--test-timeout-handler))
- (while (accept-process-output proc nil nil t)))
- (delete-process proc)
+ (unless (tramp-direct-async-process-p)
+ (dolist (tmpfile `(,tmp-name1 ,tmp-name2))
+ (unwind-protect
(with-temp-buffer
- (insert-file-contents tmpfile)
- (should
- (string-match
- "cat:.* No such file or directory" (buffer-string)))))
+ (setq proc
+ (with-no-warnings
+ (make-process
+ :name "test6" :buffer (current-buffer)
+ :command '("cat" "/does-not-exist")
+ :stderr tmpfile
+ :file-handler t)))
+ (should (processp proc))
+ ;; Read stderr.
+ (with-timeout (10 (tramp--test-timeout-handler))
+ (while (accept-process-output proc nil nil t)))
+ (delete-process proc)
+ (with-temp-buffer
+ (insert-file-contents tmpfile)
+ (should
+ (string-match
+ "cat:.* No such file or directory" (buffer-string)))))
- ;; Cleanup.
- (ignore-errors (delete-process proc))
- (ignore-errors (delete-file tmpfile)))))))
+ ;; Cleanup.
+ (ignore-errors (delete-process proc))
+ (ignore-errors (delete-file tmpfile))))))))
+
+(tramp--test--deftest-direct-async-process tramp-test30-make-process
+ "Check direct async `make-process'.")
(ert-deftest tramp-test31-interrupt-process ()
"Check `interrupt-process'."
@@ -5689,11 +5709,11 @@ This does not support special file names."
"Check, whether the sudoedit method is used."
(tramp-sudoedit-file-name-p tramp-test-temporary-file-directory))
-(defun tramp--test-windows-nt ()
+(defun tramp--test-windows-nt-p ()
"Check, whether the locale host runs MS Windows."
(eq system-type 'windows-nt))
-(defun tramp--test-windows-nt-and-batch ()
+(defun tramp--test-windows-nt-and-batch-p ()
"Check, whether the locale host runs MS Windows in batch mode.
This does not support special characters."
(and (eq system-type 'windows-nt) noninteractive))
@@ -6000,7 +6020,7 @@ Use the `ls' command."
(skip-unless (tramp--test-enabled))
(skip-unless (tramp--test-sh-p))
(skip-unless (not (tramp--test-rsync-p)))
- (skip-unless (not (tramp--test-windows-nt-and-batch)))
+ (skip-unless (not (tramp--test-windows-nt-and-batch-p)))
(skip-unless (not (tramp--test-windows-nt-and-pscp-psftp-p)))
(let ((tramp-connection-properties
@@ -6066,7 +6086,7 @@ Use the `ls' command."
(skip-unless (tramp--test-enabled))
(skip-unless (not (tramp--test-docker-p)))
(skip-unless (not (tramp--test-rsync-p)))
- (skip-unless (not (tramp--test-windows-nt-and-batch)))
+ (skip-unless (not (tramp--test-windows-nt-and-batch-p)))
(skip-unless (not (tramp--test-windows-nt-and-pscp-psftp-p)))
(skip-unless (not (tramp--test-ksh-p)))
(skip-unless (not (tramp--test-crypt-p)))
@@ -6081,7 +6101,7 @@ Use the `stat' command."
(skip-unless (tramp--test-sh-p))
(skip-unless (not (tramp--test-docker-p)))
(skip-unless (not (tramp--test-rsync-p)))
- (skip-unless (not (tramp--test-windows-nt-and-batch)))
+ (skip-unless (not (tramp--test-windows-nt-and-batch-p)))
(skip-unless (not (tramp--test-windows-nt-and-pscp-psftp-p)))
(skip-unless (not (tramp--test-ksh-p)))
(skip-unless (not (tramp--test-crypt-p)))
@@ -6103,7 +6123,7 @@ Use the `perl' command."
(skip-unless (tramp--test-sh-p))
(skip-unless (not (tramp--test-docker-p)))
(skip-unless (not (tramp--test-rsync-p)))
- (skip-unless (not (tramp--test-windows-nt-and-batch)))
+ (skip-unless (not (tramp--test-windows-nt-and-batch-p)))
(skip-unless (not (tramp--test-windows-nt-and-pscp-psftp-p)))
(skip-unless (not (tramp--test-ksh-p)))
(skip-unless (not (tramp--test-crypt-p)))
@@ -6128,7 +6148,7 @@ Use the `ls' command."
(skip-unless (tramp--test-sh-p))
(skip-unless (not (tramp--test-docker-p)))
(skip-unless (not (tramp--test-rsync-p)))
- (skip-unless (not (tramp--test-windows-nt-and-batch)))
+ (skip-unless (not (tramp--test-windows-nt-and-batch-p)))
(skip-unless (not (tramp--test-windows-nt-and-pscp-psftp-p)))
(skip-unless (not (tramp--test-ksh-p)))
(skip-unless (not (tramp--test-crypt-p)))
@@ -6223,7 +6243,7 @@ process sentinels. They shall not disturb each other."
(shell-file-name (if (tramp--test-adb-p) "/system/bin/sh" "/bin/sh"))
;; It doesn't work on w32 systems.
(watchdog
- (unless (tramp--test-windows-nt)
+ (unless (tramp--test-windows-nt-p)
(start-process-shell-command
"*watchdog*" nil
(format
@@ -6591,7 +6611,8 @@ If INTERACTIVE is non-nil, the tests are run interactively."
;; * Fix `tramp-test06-directory-file-name' for `ftp'.
;; * Investigate, why `tramp-test11-copy-file' and `tramp-test12-rename-file'
;; do not work properly for `nextcloud'.
-;; * Implement `tramp-test31-interrupt-process' for `adb'.
+;; * Implement `tramp-test31-interrupt-process' for `adb' and for
+;; direct async processes.
;; * Fix Bug#16928 in `tramp-test43-asynchronous-requests'. A remote
;; file name operation cannot run in the timer. Remove `:unstable' tag?
diff --git a/test/lisp/progmodes/compile-tests.el b/test/lisp/progmodes/compile-tests.el
index d566e7dd862..819f2e78c2a 100644
--- a/test/lisp/progmodes/compile-tests.el
+++ b/test/lisp/progmodes/compile-tests.el
@@ -267,6 +267,8 @@
3 nil 29 "test_main.cpp")
("1>test_main.cpp(29): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int"
3 nil 29 "test_main.cpp")
+ ("C:\\tmp\\test.cpp(101,11): error C4101: 'bias0123': unreferenced local variable [C:\\tmp\\project.vcxproj]"
+ 1 11 101 "C:\\tmp\\test.cpp")
;; watcom
("..\\src\\ctrl\\lister.c(109): Error! E1009: Expecting ';' but found '{'"
1 nil 109 "..\\src\\ctrl\\lister.c")
@@ -434,7 +436,7 @@ The test data is in `compile-tests--test-regexps-data'."
(compilation-num-warnings-found 0)
(compilation-num-infos-found 0))
(mapc #'compile--test-error-line compile-tests--test-regexps-data)
- (should (eq compilation-num-errors-found 94))
+ (should (eq compilation-num-errors-found 95))
(should (eq compilation-num-warnings-found 35))
(should (eq compilation-num-infos-found 28)))))
diff --git a/test/lisp/progmodes/subword-tests.el b/test/lisp/progmodes/subword-tests.el
index 86e905c8696..6aeee76110b 100644
--- a/test/lisp/progmodes/subword-tests.el
+++ b/test/lisp/progmodes/subword-tests.el
@@ -5,18 +5,20 @@
;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
;; Keywords:
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/lisp/simple-tests.el b/test/lisp/simple-tests.el
index 63e504bbe17..457de91c149 100644
--- a/test/lisp/simple-tests.el
+++ b/test/lisp/simple-tests.el
@@ -4,18 +4,20 @@
;; Author: Artur Malabarba <bruce.connor.am@gmail.com>
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/lisp/sort-tests.el b/test/lisp/sort-tests.el
index 21f483a23af..9033745e0d4 100644
--- a/test/lisp/sort-tests.el
+++ b/test/lisp/sort-tests.el
@@ -4,18 +4,20 @@
;; Author: Artur Malabarba <bruce.connor.am@gmail.com>
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/lisp/textmodes/conf-mode-tests.el b/test/lisp/textmodes/conf-mode-tests.el
index 7e870269959..7e094e8a7c2 100644
--- a/test/lisp/textmodes/conf-mode-tests.el
+++ b/test/lisp/textmodes/conf-mode-tests.el
@@ -7,18 +7,18 @@
;; This file is part of GNU Emacs.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/lisp/textmodes/css-mode-tests.el b/test/lisp/textmodes/css-mode-tests.el
index b57bbd8a9ef..38cb73b3557 100644
--- a/test/lisp/textmodes/css-mode-tests.el
+++ b/test/lisp/textmodes/css-mode-tests.el
@@ -7,18 +7,20 @@
;; This file is part of GNU Emacs.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/lisp/url/url-handlers-test.el b/test/lisp/url/url-handlers-test.el
index bf574fcc1a5..57692e53a70 100644
--- a/test/lisp/url/url-handlers-test.el
+++ b/test/lisp/url/url-handlers-test.el
@@ -4,18 +4,20 @@
;; Author: Nicolas Petton <nicolas@petton.fr>
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/lisp/wdired-tests.el b/test/lisp/wdired-tests.el
index 2cfabd1ee2d..96e88f62fec 100644
--- a/test/lisp/wdired-tests.el
+++ b/test/lisp/wdired-tests.el
@@ -4,18 +4,18 @@
;; This file is part of GNU Emacs.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/manual/cedet/cedet-utests.el b/test/manual/cedet/cedet-utests.el
index 124b49907d8..ee6be438dd3 100644
--- a/test/manual/cedet/cedet-utests.el
+++ b/test/manual/cedet/cedet-utests.el
@@ -150,7 +150,7 @@ of just logging the error."
;; Cleanup stray input and events that are in the way.
;; Not doing this causes sit-for to not refresh the screen.
;; Doing this causes the user to need to press keys more frequently.
- (when (and (interactive-p) (input-pending-p))
+ (when (and (called-interactively-p 'interactive) (input-pending-p))
(if (fboundp 'read-event)
(read-event)
(read-char)))
@@ -497,11 +497,11 @@ When optional NO-ERROR don't throw an error if we can't run tests."
(error (concat "Pulse test only works on versions of Emacs"
" that support pulsing")))
;; Run the tests
- (when (interactive-p)
+ (when (called-interactively-p 'interactive)
(message "<Press a key> Pulse one line.")
(read-char))
(pulse-momentary-highlight-one-line (point))
- (when (interactive-p)
+ (when (called-interactively-p 'interactive)
(message "<Press a key> Pulse a region.")
(read-char))
(pulse-momentary-highlight-region (point)
@@ -510,11 +510,11 @@ When optional NO-ERROR don't throw an error if we can't run tests."
(forward-char 30)
(error nil))
(point)))
- (when (interactive-p)
+ (when (called-interactively-p 'interactive)
(message "<Press a key> Pulse line a specific color.")
(read-char))
(pulse-momentary-highlight-one-line (point) 'mode-line)
- (when (interactive-p)
+ (when (called-interactively-p 'interactive)
(message "<Press a key> Pulse a pre-existing overlay.")
(read-char))
(let* ((start (point-at-bol))
@@ -530,7 +530,7 @@ When optional NO-ERROR don't throw an error if we can't run tests."
(delete-overlay o)
(error "Non-temporary overlay was deleted!"))
)
- (when (interactive-p)
+ (when (called-interactively-p 'interactive)
(message "Done!"))))
(provide 'cedet-utests)
diff --git a/test/manual/cedet/semantic-tests.el b/test/manual/cedet/semantic-tests.el
index 53552be06b2..a0899cb9326 100644
--- a/test/manual/cedet/semantic-tests.el
+++ b/test/manual/cedet/semantic-tests.el
@@ -235,7 +235,7 @@ Analyze the area between BEG and END."
(set-buffer buff)
(semantic-lex-spp-write-test)
(kill-buffer buff)
- (when (not (interactive-p))
+ (when (not (called-interactively-p 'interactive))
(kill-buffer "*SPP Write Test*"))
)))
@@ -276,7 +276,7 @@ tag that contains point, and return that."
target (lambda (start end prefix) (setq Lcount (1+ Lcount)))
(semantic-tag-start tag)
(semantic-tag-end tag))
- (when (interactive-p)
+ (when (called-interactively-p 'interactive)
(message "Found %d occurrences of %s in %.2f seconds"
Lcount (semantic-tag-name target)
(semantic-elapsed-time start nil)))
diff --git a/test/manual/image-size-tests.el b/test/manual/image-size-tests.el
index 67d8f788c8a..159e9025ae3 100644
--- a/test/manual/image-size-tests.el
+++ b/test/manual/image-size-tests.el
@@ -4,18 +4,18 @@
;; This file is part of GNU Emacs.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;; To test: Load the file and eval (image-size-tests).
;; A non-erroring result is a success.
diff --git a/test/manual/image-transforms-tests.el b/test/manual/image-transforms-tests.el
index 0ebd5c7a195..02607e63676 100644
--- a/test/manual/image-transforms-tests.el
+++ b/test/manual/image-transforms-tests.el
@@ -48,24 +48,24 @@
(let ((image "<svg height='30' width='30'>
<rect x='0' y='0' width='10' height='10'/>
<rect x='10' y='10' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <line x1='10' y1='10' x2='20' y2='20' style='stroke:#000'/>
- <line x1='20' y1='10' x2='10' y2='20' style='stroke:#000'/>
+ style='fill:none;stroke-width:1;stroke:currentColor'/>
+ <line x1='10' y1='10' x2='20' y2='20' style='stroke:currentColor'/>
+ <line x1='20' y1='10' x2='10' y2='20' style='stroke:currentColor'/>
<rect x='20' y='20' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
+ style='fill:none;stroke-width:1;stroke:currentColor'/>
</svg>")
(top-left "<svg height='10' width='10'>
<rect x='0' y='0' width='10' height='10'/>
</svg>")
(middle "<svg height='10' width='10'>
<rect x='0' y='0' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <line x1='0' y1='0' x2='10' y2='10' style='stroke:#000'/>
- <line x1='10' y1='0' x2='0' y2='10' style='stroke:#000'/>
+ style='fill:none;stroke-width:1;stroke:currentColor'/>
+ <line x1='0' y1='0' x2='10' y2='10' style='stroke:currentColor'/>
+ <line x1='10' y1='0' x2='0' y2='10' style='stroke:currentColor'/>
</svg>")
(bottom-right "<svg height='10' width='10'>
<rect x='0' y='0' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
+ style='fill:none;stroke-width:1;stroke:currentColor'/>
</svg>"))
(insert-header "Test Crop: cropping an image (only works with ImageMagick)")
(insert-test "all params" top-left image '(:crop (10 10 0 0)))
@@ -77,23 +77,23 @@
(defun test-scaling ()
(let ((image "<svg height='10' width='10'>
<rect x='0' y='0' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <line x1='0' y1='0' x2='10' y2='10' style='stroke:#000'/>
- <line x1='10' y1='0' x2='0' y2='10' style='stroke:#000'/>
+ style='fill:none;stroke-width:1;stroke:currentColor'/>
+ <line x1='0' y1='0' x2='10' y2='10' style='stroke:currentColor'/>
+ <line x1='10' y1='0' x2='0' y2='10' style='stroke:currentColor'/>
</svg>")
(large "<svg height='20' width='20'>
<rect x='0' y='0' width='20' height='20'
- style='fill:none;stroke-width:2;stroke:#000'/>
+ style='fill:none;stroke-width:2;stroke:currentColor'/>
<line x1='0' y1='0' x2='20' y2='20'
- style='stroke-width:2;stroke:#000'/>
+ style='stroke-width:2;stroke:currentColor'/>
<line x1='20' y1='0' x2='0' y2='20'
- style='stroke-width:2;stroke:#000'/>
+ style='stroke-width:2;stroke:currentColor'/>
</svg>")
(small "<svg height='5' width='5'>
<rect x='0' y='0' width='4' height='4'
- style='fill:none;stroke-width:1;stroke:#000'/>
- <line x1='0' y1='0' x2='4' y2='4' style='stroke:#000'/>
- <line x1='4' y1='0' x2='0' y2='4' style='stroke:#000'/>
+ style='fill:none;stroke-width:1;stroke:currentColor'/>
+ <line x1='0' y1='0' x2='4' y2='4' style='stroke:currentColor'/>
+ <line x1='4' y1='0' x2='0' y2='4' style='stroke:currentColor'/>
</svg>"))
(insert-header "Test Scaling: resize an image (pixelization may occur)")
(insert-test "1x" image image '(:scale 1))
@@ -107,27 +107,27 @@
(defun test-scaling-rotation ()
(let ((image "<svg height='20' width='20'>
<rect x='0' y='0' width='20' height='20'
- style='fill:none;stroke-width:1;stroke:#000'/>
+ style='fill:none;stroke-width:1;stroke:currentColor'/>
<rect x='0' y='0' width='10' height='10'
- style='fill:#000'/>
+ style='fill:currentColor'/>
</svg>")
(x2-90 "<svg height='40' width='40'>
<rect x='0' y='0' width='40' height='40'
- style='fill:none;stroke-width:1;stroke:#000'/>
+ style='fill:none;stroke-width:1;stroke:currentColor'/>
<rect x='20' y='0' width='20' height='20'
- style='fill:#000'/>
+ style='fill:currentColor'/>
</svg>")
(x2--90 "<svg height='40' width='40'>
<rect x='0' y='0' width='40' height='40'
- style='fill:none;stroke-width:1;stroke:#000'/>
+ style='fill:none;stroke-width:1;stroke:currentColor'/>
<rect x='0' y='20' width='20' height='20'
- style='fill:#000'/>
+ style='fill:currentColor'/>
</svg>")
(x0.5-180 "<svg height='10' width='10'>
<rect x='0' y='0' width='10' height='10'
- style='fill:none;stroke-width:1;stroke:#000'/>
+ style='fill:none;stroke-width:1;stroke:currentColor'/>
<rect x='5' y='5' width='5' height='5'
- style='fill:#000'/>
+ style='fill:currentColor'/>
</svg>"))
(insert-header "Test Scaling and Rotation: resize and rotate an image (pixelization may occur)")
(insert-test "1x, 0 degrees" image image '(:scale 1 :rotation 0))
diff --git a/test/manual/scroll-tests.el b/test/manual/scroll-tests.el
index 96a419a29d9..937e0b12799 100644
--- a/test/manual/scroll-tests.el
+++ b/test/manual/scroll-tests.el
@@ -4,18 +4,18 @@
;; This file is part of GNU Emacs.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/src/charset-tests.el b/test/src/charset-tests.el
index 9a1d0a46f91..86a0d6ffc1a 100644
--- a/test/src/charset-tests.el
+++ b/test/src/charset-tests.el
@@ -2,18 +2,20 @@
;; Copyright 2017-2020 Free Software Foundation, Inc.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/src/chartab-tests.el b/test/src/chartab-tests.el
index 0ddea2b338c..4d52dc367c8 100644
--- a/test/src/chartab-tests.el
+++ b/test/src/chartab-tests.el
@@ -4,18 +4,20 @@
;; Author: Eli Zaretskii <eliz@gnu.org>
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/src/cmds-tests.el b/test/src/cmds-tests.el
index e98e5784609..302b00c6760 100644
--- a/test/src/cmds-tests.el
+++ b/test/src/cmds-tests.el
@@ -5,18 +5,20 @@
;; Author: Nicolas Richard <youngfrog@members.fsf.org>
;; Keywords:
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/src/doc-tests.el b/test/src/doc-tests.el
index 50cf0144b80..797b9ba5480 100644
--- a/test/src/doc-tests.el
+++ b/test/src/doc-tests.el
@@ -4,18 +4,20 @@
;; Author: Eli Zaretskii <eliz@gnu.org>
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/src/editfns-tests.el b/test/src/editfns-tests.el
index 18f76afca91..d7c7aec17c3 100644
--- a/test/src/editfns-tests.el
+++ b/test/src/editfns-tests.el
@@ -4,18 +4,18 @@
;; This file is part of GNU Emacs.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/src/fileio-tests.el b/test/src/fileio-tests.el
index 96b03a01372..7baa4c7e2fa 100644
--- a/test/src/fileio-tests.el
+++ b/test/src/fileio-tests.el
@@ -98,15 +98,48 @@ Also check that an encoding error can appear in a symlink."
(ert-deftest fileio-tests--relative-HOME ()
"Test that expand-file-name works even when HOME is relative."
- (let ((old-home (getenv "HOME")))
+ (let ((process-environment (copy-sequence process-environment)))
(setenv "HOME" "a/b/c")
(should (equal (expand-file-name "~/foo")
(expand-file-name "a/b/c/foo")))
(when (memq system-type '(ms-dos windows-nt))
;; Test expansion of drive-relative file names.
(setenv "HOME" "x:foo")
- (should (equal (expand-file-name "~/bar") "x:/foo/bar")))
- (setenv "HOME" old-home)))
+ (should (equal (expand-file-name "~/bar") "x:/foo/bar")))))
+
+(ert-deftest fileio-tests--HOME-trailing-slash ()
+ "Test that expand-file-name of \"~\" respects trailing slash."
+ (let ((process-environment (copy-sequence process-environment)))
+ (dolist (home
+ (if (memq system-type '(windows-nt ms-dos))
+ '("c:/a/b/c" "c:/a/b/c/")
+ '("/a/b/c" "/a/b/c/")))
+ (setenv "HOME" home)
+ (should (equal (expand-file-name "~") (expand-file-name home))))))
+
+(ert-deftest fileio-tests--expand-file-name-trailing-slash ()
+ (dolist (fooslashalias '("foo/" "foo//" "foo/." "foo//." "foo///././."
+ "foo/a/.."))
+ (if (memq system-type '(windows-nt ms-dos))
+ (progn
+ (should (equal (expand-file-name fooslashalias "c:/") "c:/foo/"))
+ (should (equal (expand-file-name (concat "c:/" fooslashalias))
+ "c:/foo/"))
+ (should (equal (expand-file-name "." "c:/usr/spool/")
+ "c:/usr/spool/"))
+ (should (equal (expand-file-name "" "c:/usr/spool/")
+ "c:/usr/spool/")))
+ (should (equal (expand-file-name fooslashalias "/") "/foo/"))
+ (should (equal (expand-file-name (concat "/" fooslashalias)) "/foo/"))
+ (should (equal (expand-file-name "." "/usr/spool/") "/usr/spool/"))
+ (should (equal (expand-file-name "" "/usr/spool/") "/usr/spool/"))))
+ ;; Trailing "B/C/.." means B must be a directory.
+ (if (memq system-type '(windows-nt ms-dos))
+ (progn
+ (should (equal (expand-file-name "c:/a/b/c/..") "c:/a/b/"))
+ (should (equal (expand-file-name "c:/a/b/c/../") "c:/a/b/")))
+ (should (equal (expand-file-name "/a/b/c/..") "/a/b/"))
+ (should (equal (expand-file-name "/a/b/c/../") "/a/b/"))))
(ert-deftest fileio-tests--insert-file-interrupt ()
(let ((text "-*- coding: binary -*-\n\xc3\xc3help")
diff --git a/test/src/lread-tests.el b/test/src/lread-tests.el
index 6efd8bed302..26fd6aa22a1 100644
--- a/test/src/lread-tests.el
+++ b/test/src/lread-tests.el
@@ -6,18 +6,18 @@
;; This file is part of GNU Emacs.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/src/print-tests.el b/test/src/print-tests.el
index 0f729964248..42e5962137c 100644
--- a/test/src/print-tests.el
+++ b/test/src/print-tests.el
@@ -4,18 +4,18 @@
;; This file is part of GNU Emacs.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
diff --git a/test/src/process-tests.el b/test/src/process-tests.el
index 748afe41d2c..e15ad47f968 100644
--- a/test/src/process-tests.el
+++ b/test/src/process-tests.el
@@ -2,18 +2,20 @@
;; Copyright (C) 2013-2020 Free Software Foundation, Inc.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
diff --git a/test/src/timefns-tests.el b/test/src/timefns-tests.el
index 51dd1d1aeb5..b35a5287946 100644
--- a/test/src/timefns-tests.el
+++ b/test/src/timefns-tests.el
@@ -4,18 +4,20 @@
;; This file is part of GNU Emacs.
-;; This program is free software; you can redistribute it and/or modify
+;; 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.
-;; This program is distributed in the hope that it will be useful,
+;; 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/>.
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Code:
(require 'ert)