dotemacs

My Emacs configuration
git clone git://git.entf.net/dotemacs
Log | Files | Refs | LICENSE

commit 3e10447f8945623d8192a6d3d04e4092624aa81a
parent 5e2d5101ef6d5133ae42834c4ccd890ae439c7ef
Author: Lukas Henkel <lh@entf.net>
Date:   Sat, 25 Nov 2023 12:29:02 +0100

Use modus-operandi theme

Diffstat:
Aelpa/modus-themes-4.3.0.signed | 3+++
Aelpa/modus-themes-4.3.0/.dir-locals.el | 4++++
Aelpa/modus-themes-4.3.0/CHANGELOG.org | 9405+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/README-elpa | 33+++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/README.md | 33+++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/dir | 19+++++++++++++++++++
Aelpa/modus-themes-4.3.0/doc/doclicense.texi | 505+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/doc/modus-themes.info | 6278+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/doc/modus-themes.org | 5906+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/modus-operandi-deuteranopia-theme.el | 486+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/modus-operandi-theme.el | 484+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/modus-operandi-tinted-theme.el | 483+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/modus-operandi-tritanopia-theme.el | 486+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/modus-themes-autoloads.el | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/modus-themes-pkg.el | 2++
Aelpa/modus-themes-4.3.0/modus-themes.el | 4237+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/modus-themes.info | 6278+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/modus-vivendi-deuteranopia-theme.el | 485+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/modus-vivendi-theme.el | 484+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/modus-vivendi-tinted-theme.el | 483+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/modus-vivendi-tritanopia-theme.el | 486+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aelpa/modus-themes-4.3.0/theme-loaddefs.el | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Minit.el | 5++++-
23 files changed, 36707 insertions(+), 1 deletion(-)

diff --git a/elpa/modus-themes-4.3.0.signed b/elpa/modus-themes-4.3.0.signed @@ -0,0 +1,2 @@ +Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) <elpasign@elpa.gnu.org> (trust undefined) created at 2023-09-19T23:10:01+0200 using RSA +Good signature from 645357D2883A0966 GNU ELPA Signing Agent (2023) <elpasign@elpa.gnu.org> (trust undefined) created at 2023-09-19T23:10:02+0200 using EDDSA +\ No newline at end of file diff --git a/elpa/modus-themes-4.3.0/.dir-locals.el b/elpa/modus-themes-4.3.0/.dir-locals.el @@ -0,0 +1,4 @@ +;;; Directory Local Variables +;;; For more information see (info "(emacs) Directory Variables") + +((emacs-lisp-mode . ((indent-tabs-mode . nil)))) diff --git a/elpa/modus-themes-4.3.0/CHANGELOG.org b/elpa/modus-themes-4.3.0/CHANGELOG.org @@ -0,0 +1,9405 @@ +#+TITLE: Change log of the Modus Themes for GNU Emacs +#+AUTHOR: Protesilaos Stavrou +#+EMAIL: info@protesilaos.com +#+OPTIONS: ':nil toc:nil num:nil author:nil email:nil + +This document contains the release notes that are included in each +tagged commit on the project's main git repository: +<https://git.sr.ht/~protesilaos/modus-themes>. + +The newest release is at the top. Since the notes are meant to be in +plain text format, I copy them verbatim. + +For further details, please consult these additional resources: + ++ Manual :: <https://protesilaos.com/emacs/modus-themes> ++ Screenshots :: <https://protesilaos.com/emacs/modus-themes-pictures> + +* 4.3.0 +:PROPERTIES: +:CUSTOM_ID: h:4783bc29-3055-426d-9acb-51e4d0741871 +:END: + +** All themes except the tritanopia ones have a new hover colour +:PROPERTIES: +:CUSTOM_ID: h:b92b176e-3e9a-420d-bbbe-3c3e38b47027 +:END: + +The previous colour was not sufficiently distinct from what each theme +defines for the =bg-completion= palette entry (preview a palette with +=M-x modus-themes-preview-colors= or =M-x modus-themes-preview-colors-current=). +This would make it hard to spot the difference while, for example, +using ~vertico-mode~ in tandem with ~vertico-mouse-mode~. + +Same principle for the difference between the mouse hover and lazy +isearch highlights (e.g. in Dired or Occur buffers). + +Changing the hue here follows the same principle that underpinned the +redesign of the grey backgrounds for version 4 of the project: +depending on hardware capabilities, colour reproduction may not be +optimal, so we need to be more considerate with the choice of colour +values, erring on the side of caution. + +The ~modus-operandi-tritanopia~ and ~modus-vivendi-tritanopia~ themes +are not affected by this initiative, as they already used highly distinct hues. + +Thanks to Daniel Mendler for bringing this matter to my attention and +for testing the proposed alternatives. This was done via a private +channel and the information is shared with permission. Daniel is the +developer of ~vertico~, among many other excellent packages: +<https://github.com/minad> + +** Japanese holidays have the expected style +:PROPERTIES: +:CUSTOM_ID: h:2de9cef6-c6f1-4c2e-97ce-46d8a7306bae +:END: + +Japanese calendars style Saturdays uniquely and the Modus themes now +do the same for those who use the ~japanese-holidays~ package. +Saturdays show up in a blue colour (which changes to cyan for the +~modus-operandi-tritanopia~, ~modus-vivendi-tritanopia~ themes). + +Each theme's palette has a new semantic colour mapping called +=date-holiday-other=, just in case we ever encounter another scenario +like this one (users can override any entry in the palette---consult +the manual for the technicalities). + +Thanks to Olaf Meeuwissen for bringing this package to my attention +and showing me how traditional Japanese calendars style Saturdays. +This was done in issue 311 on the GitLab mirror: +<https://gitlab.com/protesilaos/modus-themes/-/issues/311>. + +** Each theme has semantic colour mappings for terminal emulators +:PROPERTIES: +:CUSTOM_ID: h:f3ae786a-9e01-4363-ae98-898f2ad34f7b +:END: + +These are used by ~ansi-term~, ~vterm~, and the like. The idea is to +empower users to differentiate background and foreground values, +should they ever encounter a need to do so (when in doubt, do +nothing). + +By convention, terminal emulators use the same value for both +background and foreground, although this is not optimal with high +contrast themes because what works as a foreground does not +necessarily look nice as a background. + +The default values of the new mappings retain the prior state, just to +not break existing configurations. Consider this a tacit user option +for those who really need it. + +Thanks to Tony Zorman for reporting the problem that provided the +impetus for this change: +<https://lists.sr.ht/~protesilaos/modus-themes/%3C87fs4wforf.fsf%40hyperspace%3E>. + +** All theme definitions conform with the latest standard for metadata +:PROPERTIES: +:CUSTOM_ID: h:2af0114f-b96a-4e89-ad2f-850d53538efa +:END: + +Themes are expected to declare their background type and affinity, +such that the built-in command ~theme-choose-variant~ can do what it +describes (switch between related themes). I was already doing this, +though I had to make some adjustments. This is in response to Emacs +bug#65468: <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=65468>. +Thanks to Mauro Aranda for bringing the matter to my attention. + +** Proper colours for the inline preview of the ~corfu~ top candidate +:PROPERTIES: +:CUSTOM_ID: h:89d40a68-7573-4994-9ecc-fea40c823472 +:END: + +The ~corfu-candidate-overlay~ package is used in tandem with the +~corfu~ package to create an inline preview of the first matching +candidate. Thanks to Nicolas Semrau for bringing this matter to my +attention in issue 89 on the GitHub mirror: +<https://github.com/protesilaos/modus-themes/issues/89>. + +** Context indicators for the mode-line or header-line (breadcrumb.el) +:PROPERTIES: +:CUSTOM_ID: h:dc391e85-650f-444e-b909-849d659921fb +:END: + +I added support for the new ~breadcrumb~ package by João Távora. It +displays information about where we are in the given file, such as +under which Org heading or inside which function. The indicator can +be shown on the mode-line or the header-line. Either way, it will now +be legible and consistent with its surroundings. + +** The new family of nerd-icons is covered by the themes +:PROPERTIES: +:CUSTOM_ID: h:0409d429-5307-43d6-9bf4-fabc958c2540 +:END: + +This is a new set of packages: ~nerd-icons~, ~nerd-icons-completion, +~nerd-icons-dired~, ~nerd-icons-ibuffer~. A popular package that uses +the Nerd icons is ~doom-modeline~, which the themes support as well. + +** All icons look as intended again +:PROPERTIES: +:CUSTOM_ID: h:a01075c6-b931-4b35-bdbd-2d1223101560 +:END: + +Some faces from the ~all-the-icons~ package were not configured +because I accidentally changed their name from something like +~all-the-icons-red-alt~ to ~all-the-icons-red-warmer~. I did that +while renaming the colours defined in each theme's palette, to make +them more meaningful ("warmer red" can hint at something whereas "alt +red" is more abstract). + +** Corrected the documentation about custom Org faces +:PROPERTIES: +:CUSTOM_ID: h:5c254346-370e-4510-bcc7-70a1cca2c5a0 +:END: + +The Modus themes manual shows how to configure arbitrary TODO keywords +to inherit the style of an arbitrary face (get the list of faces +present in your Emacs with =M-x list-faces-display=). The previous +value I used was faulty. It now is as intended. Thanks to +soaringbird for reporting the issue on the mailing list: +<https://lists.sr.ht/~protesilaos/modus-themes/%3CNXPVkVk--3-9%40tuta.io%3E>. + +** The colours used by =avy= are better for users with tritanopia +:PROPERTIES: +:CUSTOM_ID: h:3605693e-bd6d-40a0-a1d4-199684c89081 +:END: + +I changed the sequence of colours displayed by commands such as +~avy-goto-char-timer~ such that each individual background does not +blend with the ones adjacent to it, while respecting the overall needs +of a tritanopia-friendly design. I also tweaked the colour values to +achieve the desired result. The backgrounds remain distinct from +their context but now also work harmoniously together. + +** The =bg-dim= palette entry is marginally brighter in all Modus operandi variants +:PROPERTIES: +:CUSTOM_ID: h:8a3cb4f1-e7f8-48f1-832c-27e64b126b2d +:END: + +After extensive testing and side-by-side comparisons, I have concluded +that the marginal increase in brightness improves the affected +interfaces. + +The =bg-dim= background is used, among others, in the header-line, the +popup of the ~company~ and ~corfu~ packages, as well as the Org source +blocks (when the user option ~modus-themes-org-blocks~ is configured +appropriately). + +** The "intense" palette override preset has new colours for tables and prose metadata +:PROPERTIES: +:CUSTOM_ID: h:3a990310-337c-457f-8f40-1af6d1b557f6 +:END: + +This concerns the ~modus-themes-preset-overrides-intense~ (refer to +its documentation on how to use it). The primary target of these +changes is Org mode and the overall effect is subtle. The previous +colours did not combine nicely with all structural elements. For +example, Org clocktables would obscure timestamps by being the same +colour as them, while the table formula would not stand out. These +styles did not fit into the concept of "intense" colours. + +** The "warmer" palette override preset has more legible strings +:PROPERTIES: +:CUSTOM_ID: h:64cbd701-1344-48cc-8bcf-fc9712438013 +:END: + +The ~modus-themes-preset-overrides-warmer~ uses a more prominent warm +green value for strings in programming modes. The effect is subtle, +though it fits in better with the overall aesthetic of these palette +overrides. + +** Org document keywords like =#+author= are optionally monospaced +:PROPERTIES: +:CUSTOM_ID: h:096b75ec-802c-43e4-81ed-6db92b45654c +:END: + +When the user option ~modus-themes-mixed-fonts~ is non-nil, all Org +document keywords will be rendered with the ~fixed-pitch~ face. This +ensures consistency between keywords such as =#+author= and "meta +lines" like =#+texinfo=. Thanks to user fluentpwn for the change: it +is one line and thus the author does not need to assign copyright to +the Free Software Foundation. + +** Git commit summary lines have a more precise style +:PROPERTIES: +:CUSTOM_ID: h:2aecd902-3a0b-4544-98f4-dbb42cbad672 +:END: + +This concerns the first line in a Git commit message, as seen while +working with the ~magit~ package. Same principle for the ~log-edit~ +buffer used by the built-in VC framework. Before, I was hardcoding a +blue colour value, whereas now I apply the ~success~ face. The +~success~ face is designed to contrast with the ~warning~ face that is +used to show overlong summaries. Furthermore, the added indirection +makes it possible to particularise the colour value, which I do for +the tritanopia themes that cannot use blue. + +** Miscellaneous +:PROPERTIES: +:CUSTOM_ID: h:7391fd7d-6e70-4419-a8d6-f34d9ae075b1 +:END: + +- Removed explicit support for the built-in ~css-mode~. Its default + faces are decent. They inherit from standard font-lock faces that + the themes already cover. + +- Recalibrated wordwise ("refined") diffs for deuteranopia. The + ~modus-operandi-deuteranopia~ and ~modus-vivendi-deuteranopia~ have + a little bit more intense colour values applied to wordwise, else + "refined", diffs. These concern removed lines. The effect is + visible while using ~magit~ or the built-in ~diff-mode~. + +- Backported emacs.git commit =4cf33b6bd02b868ebbf112da7926d7c3c64517ce=. + It removed the space from the front matter of the =modus-themes.org= + file (i.e. the manual) because the Org export did not produce the + right results, per Emacs bug#64548. Thanks to Stephen Berman for + reporting the issue and making the requisite change. + +- Added support for the `erts-mode`. Thanks to Kevin Fleming for + informing me about this built-in mode. This was done in issue 85 on + the GitHub mirror: <https://github.com/protesilaos/modus-themes/issues/85>. + +- Fixed a typo in the ~modus-themes-preset-overrides-intense~ doc + string. Thanks to Nicolas Semrau for bringing this matter to my + attention. It was done in issue 90 on the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/90>. + +- Made all commands that prompt for a theme (~modus-themes-select~, + ~modus-themes-preview-colors~) apply the =theme= category to the + available candidates. This allows the user to target said category + to affect the relevant functions. For example, to set completion + styles with ~completion-category-overrides~ or to define a custom + annotation function with the ~marginalia~ package. + +- Added support for new ~appt-notification~ face (Emacs 30). Change + upstream by me. + +* 4.2.0 +:PROPERTIES: +:CUSTOM_ID: h:29370d83-23c4-415b-afbf-ad85d4296c86 +:END: + +** I won a Google award for the Modus themes +:PROPERTIES: +:CUSTOM_ID: h:1ffc8660-511d-4fa8-aff4-11da8246a186 +:END: + +Report here: <https://protesilaos.com/codelog/2023-05-25-emacs-google-award/>. + +This is not a "change" per se, but it is worth documenting here. It +shows how important accessibility can be in empowering people to use +their computer and, in our case, to exercise their software freedoms. + +The Modus themes tend to one aspect of accessibility. They do not +exhaust the topic, though they should at least raise awareness about +the significance of tending to the usability needs of everyone. The +effort I put into documenting the themes (and my other packages) +should be understood in this light as a means of helping people enjoy +their software freedom by learning how to use and extend the program +in question. + +** New tritanopia-optimised themes +:PROPERTIES: +:CUSTOM_ID: h:b92706b0-9d53-4015-8916-9db3c0c87068 +:END: + +I have created a pair of light and dark themes that are intended for +people with blue-yellow colour deficiency (tritanopia). These are +~modus-operandi-tritanopia~ (light) and ~modus-vivendi-tritanopia~ +(dark). Screenshots of all the Modus themes are available on my +website: <https://protesilaos.com/emacs/modus-themes-pictures>. + +The entire collection is now described in the manual as follows: + +#+begin_quote +The Modus themes consist of eight themes, divided into four subgroups. + +- Main themes :: ~modus-operandi~ is the project's main light theme, + while ~modus-vivendi~ is its dark counterpart. These two themes are + part of the project since its inception. They are designed to cover + a broad range of needs and are, in the opinion of the author, the + reference for what a highly legible "default" theme should look + like. + +- Tinted themes :: ~modus-operandi-tinted~ and ~modus-vivendi-tinted~ + are variants of the two main themes. They slightly tone down the + intensity of the background and provide a bit more color variety. + ~modus-operandi-tinted~ has a set of base tones that are shades of + light ochre (earthly colors), while ~modus-vivendi-tinted~ gives a + night sky impression. + +- Deuteranopia themes :: ~modus-operandi-deuteranopia~ and its + companion ~modus-vivendi-deuteranopia~ are optimized for users with + red-green color deficiency. This means that they do not use red and + green hues for color-coding purposes, such as for diff removed and + added lines. Instead, they implement colors that are discernible by + users with deueteranopia or deuteranomaly (mostly yellow and blue + hues). + +- Tritanopia themes :: ~modus-operandi-tritanopia~ and its counterpart + ~modus-vivendi-tritanopia~ are optimized for users with blue-yellow + color deficiency. The idea is the same as with the deuteranopia + variants: color coding relies only on hues that are accessible to + people with tritanopia or tritanomaly, namely, shades of red and + cyan. +#+end_quote + +** Recalibrated the "graph" colours in all themes +:PROPERTIES: +:CUSTOM_ID: h:60bb2797-2db6-4d47-9d27-7d1f32291707 +:END: + +The new palette subset improves the contrast of all the relevant +colours when presented side-by-side. These are most notably used by +the ~org-habit~ consistency graph, which is displayed in the Org +agenda. The deuteranopia and tritanopia themes have their own bespoke +colours for this purpose, due to their specific requirements for +colour coding (e.g. they cannot use green). + +** Faces or face groups +:PROPERTIES: +:CUSTOM_ID: h:4b68159e-d998-4781-b202-74a3dcc8ae8e +:END: + +- Introduced a subtle 3D effect for clickable buttons, replacing the + previous 2D design. I realised the flat style creates ambiguity + between the button and the text fields. This happens, for example, + with =M-x customize-variable= for ~org-capture-templates~ which has + lots of button and text field combinations. The added sense of + depth helps with the usability of these buttons because it makes + them unambiguous. Personally, I prefer the 2D approach, but here we + have a trade-off between usability and aesthetics. According to + what I state in the manual: + + #+begin_quote + If there arises an inescapable trade-off between usability and + stylistic considerations, we will always opt for the former. + #+end_quote + +- Refashioned the ~whitespace-mode~ to be much more subtle and added + the concomitant semantic colour mappings. + + The previous style involved the use of a dim grey background for + each invisible character. While this is was good to spot invisible + characters quickly, it was a major hindrance for users who want to + run ~whitespace-mode~ at all times (e.g. for the Python programming + language which is space-sensitive). + + We thus remove the backgrounds by default but provide the option to + reinstate them via palette overrides (as documented at length in the + manual). To this end, we have two new semantic colour mappings for + ordinary space, its invisible characters, as well as space errors. + + Thanks to Christian Tietze and Oliver Epper for their feedback in + issue 80 on the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/80>. + +- Applied a more subtle background for faces ~menu-bar-mode~, + ~tool-bar-mode~, ~scroll-bar-mode~. They do not need to stand out + so much because the toolkit already takes care of that. Also, we do + not want to dillute the semantic value of either ~bg-tab-bar~ or + ~fringe~ palette colour mappings that I was wrongly using before in + this context. Note that those faces may not apply, depending on the + underlying tool kit. For example, I encounter them with the Lucid + build of Emacs, though not with the GTK one. + +- Fix the critical typo of 'widget-buton', which prevented the actual + ~widget-button~ face from being affected by the themes. Thanks to + Steve Downey for pointing it out in issue 73 on the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/73>. + +- Added support for the ~disk-usage~ package. It is made to look like + Dired, to the extent possible. Thanks to Nacho Barrientos for the + patch: <https://lists.sr.ht/~protesilaos/modus-themes/patches/39822>. + The change is small and does not require copyright assignment to the + Free Software Foundation. + +- Made the ~eglot-diagnostic-tag-unnecessary-face~ look like a + warning. By default it inherits the ~shadow~ face, which makes it + counter-intuitive as it dims the text instead of bringing it to our + attention. The intent of ~eglot-diagnostic-tag-unnecessary-face~ is + to highlight unused symbols, so this is better presented as a + warning. + + Thanks to Augusto Stoffel for bringing this matter to my attention. + This was done via a private channel and the information is shared + with permission. + +- Changed the ~smerge-markers~ to inherit from ~diff-header~ instead + of ~diff-heading~. Thanks to Steve Downey for the contribution. + This was done in pull request 74 on the GitHub mirror: + <https://github.com/protesilaos/modus-themes/pull/74>. The change + is small and does not require copyright assignment to the Free + Software Foundation. + +- Added support for the ~jinx~ package. This was originally done by + Tomasz Hołubowicz in pull request 71 on the GitHub mirror: + <https://github.com/protesilaos/modus-themes/pull/71>. The change + is small and does not require copyright assignment to the Free + Software Foundation. I then modified it to make the underlines look + like warnings instead of errors. This is because of how the package + works: it automatically highlights misspellings in the visible + portion of the buffer. There are cases where this results in a very + intense presentation, which can be distracting. We want to reduce + the overall intensity and not draw too much attention to those + highlights. + +- Extended coverage of Org to the new ~org-agenda-calendar-daterange~ + face (part of Org version 9.7). Thanks to Gautier Ponsinet for the + patch, which I received via a private channel. The change is small + and does not require copyright assignment to the Free Software + Foundation. In addition to this, I introduced a new semantic colour + mapping in the themes' palette called ~date-range~. This can be + used with the palette overrides, which are documented at length in + the manual (there are lots of copy-pastable examples as well). + +- Supported all of the new faces of the built-in ~proced~ package. + These are part of Emacs 29 and make the ~proced~ buffers more + colourful, subject to the user option ~proced-enable-color-flag~. + As always, the themes strive to avoid exaggerations, meaning that I + apply colour with restraint: not all faces need to stand out. + +- Included the ~rst-mode~ in the list of explicitly supported + packages, making its heading look like those of Org, Markdown, etc. + Thanks to David Edmondson for the patch: + <https://lists.sr.ht/~protesilaos/modus-themes/patches/40625>. I + believe David has already assigned copyright to the Free Software + Foundation, though this patch is small anyway. + +- Covered all the new faces of the built-in ~flymake~ package. These + concern the inline feedback messages (Emacs 30) as well as those + that appear in the echo area (Emacs 29). The former are subject to + the user option ~flymake-show-diagnostics-at-end-of-line~. + +- Reduced the intensity of the ~which-key~ prefix descriptions. Those + are the keymaps that displayed by ~which-key~ to hint that typing + the given key will open a new ~which-key~ page with more keys. + +- Configured new ~vundo-saved~ and ~vundo-last-saved~ faces of the + ~vundo~ package. They are designed to be easy to read, without + going over-the-top. Thanks to Nicolas Semrau for bringing this + matter to my attention in issue 79 on the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/79>. + +- Removed the deprecated ~consult-preview-cursor~ face and made the + requisite adjustments to the ~consult~ faces. This was done in + commit =267b0c9= of the Consult Git repository. Discussed here: + <https://github.com/minad/consult/issues/764#issuecomment-1537491625>. + +- Instructed the ~shr-selected-link~ face of the built-in ~shr~ + package to use a "mark selection" style instead of the semantically + incorrect "intense red" it had before. This change is helpful for + those who override the palette of their Modus theme of choice, while + it also allows us to have varied colours depending on the + requirements of each theme (e.g. deuteranopia/tritanopia compared to + the defaults). + +- Did the same as above, mutatis mutandis, for the faces + ~transient-disabled-suffix~, ~web-mode-error-face~, + ~erc-dangerous-host-face~, ~aw-minibuffer-leading-char-face~, + ~binder-sidebar-highlight~, ~binder-sidebar-missing~, + ~image-dired-thumb-flagged~, ~image-dired-thumb-mark~, + ~info-menu-star~, ~rainbow-delimiters-mismatched-face~, + ~evil-ex-substitute-matches~, ~iedit-occurrence~, + ~iedit-read-only-occurrence~, ~pgtk-im-0~, ~dired-narrow-blink~. + +- Enhanced the ~image-dired~ mark faces with a box border, as the use + of a background alone can be obscured by the underlying image + thumbnail, depending on its figures/colours. + +- Removed the backgrounds from the ~powerline-evil~ faces and + simplified their overral presentation in the interest of + maintainability. The old styles were hard to predict and test. + There could easily be conflicts, such as if the user would override + the colours of the mode line. + +- Ensured that ~diary~ and ~holiday~ colours are distinct and legible, + without being too intense. + +** Changes to the manual or other documentation +:PROPERTIES: +:CUSTOM_ID: h:d3c12dd0-4231-420b-a212-b6bd571c5c34 +:END: + +- Updated the doc string of the primary customisation group defined by + the themes to reflect the support for the case of tritanopia. + +- Included links to the web page of the manual and the one with the + sample pictures in the customisation groups. Those links appear in + the various Custom UI buffers. + +- Introduced an annotation function for all commands that involve + minibuffer completion. The annotations display the one-line + description of each theme, making it easier for a user to pick their + preferred choice (e.g. when using the ~modus-themes-select~ + command). + +- Defined semantic colour mappings for "marks". These are used by + ~dired~, ~trashed~, ~proced~, and others. These is no change to the + default appearance of what users are already familiar with, though + it is now possible to override those styles. + +- Complemented the subset of semantic colour mappings for + errors/warnings with "prominent" variants. Those employ a + background and foreground combination. They are used in all sorts + of contexts, such as for fringe errors (~flymake~, ~flycheck~, ...), + ~query-replace~, ~isearch-fail~, and others. + +- Wrote sample code on how to add "padding" to the Emacs frame and the + space between the Emacs windows. This makes for a presentation that + some users find easier to work with. + +- Corrected the sample code for ~git-gutter~ to use the appropriate + symbols from the theme palette. Thanks to Christian Tietze for the + patch: <https://lists.sr.ht/~protesilaos/modus-themes/patches/40354>. + The change is small and does not require copyright assignment to the + Free Software Foundation. + +- Removed ~moody~ from the list of packages explicitly supported by + the themes. We stopped supporting it since version 4 that removed + the relevant user option for the mode line. The idea is that the + mode line is better handled by the user without interference from + the theme, due to the number of options available (and how brittle + those can be when interacting with unpredictable face definitions). + Thanks to Nicolas De Jaeghere for reminding me to remove ~moody~ + from the manual: + <https://lists.sr.ht/~protesilaos/modus-themes/%3Cypi9jzyclqxy.fsf%40gmail.com%3E#%3C87jzybdgg1.fsf@dejaeghe.re%3E>. + +** Miscellaneous +:PROPERTIES: +:CUSTOM_ID: h:7240990a-2b4d-442c-a15c-84c8d8b26622 +:END: + +- Added two new preset palette overrides to make the overall + presentation "warmer" or "cooler". Those are called + ~modus-themes-preset-overrides-warmer~ and + ~modus-themes-preset-overrides-cooler~, respectively. The manual + explains how those presets can be used. I suggest the user does not + add such overrides if they intend to load any of the deuteranopia or + tritanopia themes, due to the specific requirements of their design. + +- Refined the deuteranopia yellows for warnings, errors, and comments. + These otherwise slight adjustments make it considerably easier to + tell apart distinct elements that may be positioned close together. + +- Tweaked the deuteranopia semantic colour mappings for emails. The + subject line use a more appropriate colour value, while level 3 + quotes stand out a bit more than they did before, without being + needlessly intense. + +- Arranged for the ~modus-themes-load-theme~ function return the value + of the =THEME= argument it accepts. The intent is to allow other + functions that call this one to capture the return value for their + purposes (such as with a ~let~ binding). Thank to Oliver Epper for + the feedback in issue 78 on the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/78>. + +* 4.1.0 +:PROPERTIES: +:CUSTOM_ID: h:d028f117-8a74-4c0c-b838-9f6bf2b43c19 +:END: + +** Recursive semantic colour mapping +:PROPERTIES: +:CUSTOM_ID: h:262e2f5f-4db0-4549-a5ba-4e57cd2edc6a +:END: + +Version 4 of the Modus themes changed how all colour-related +customisations are done. Instead of multiple user options with +hard-coded stylistic presets, users have access to a comprehensive +system of "named colours" and "semantic colour mappings". The former +is an association between a name, like =blue-warmer=, and a colour +value such as =#3548cf=. While semantic colour mappings are +associations between syntactic/interface constructs and named colours, +such as what value level 2 headings have. + +When overriding the palette users can now define semantic colour +mappings whose value is another such mapping. This recursion +simplifies how multiple overrides are defined. + +The manual offers extensive guidance on the topic of palette +overrides. There are many sections that include code samples that are +ready for use. + +The addition of recursive semantic colour mappings solves a problem +reported by Imran Khan on the mailing list where they were trying to +do what made sense (recursion) but the old code did not permit as +much: +<https://lists.sr.ht/~protesilaos/modus-themes/%3Cb7ca4702162fd575593f8ded28d9a888.contact%40imrankhan.live%3E>. + +I was aware of that constraint from before the release of version +4.0.0 but was hesitant to implement recursion prior to getting some +feedback on the new palette overriding feature. + +Also thanks to Christian Tietze for participating in that discussion +on the mailing list. + +** Extract an arbitrary colour from a given theme's palette +:PROPERTIES: +:CUSTOM_ID: h:6ba1437f-e55f-4c3a-9c03-b0035293b4a2 +:END: + +I formalised the function ~modus-themes-get-color-value~ and +documented it at length. It accepts a =COLOR= argument, which +represents an entry in the palette (named colour or semantic colour +value), as well as optional =OVERRIDES= and =THEME= arguments. When +=OVERRIDES= is non-nil, ~modus-themes-get-color-value~ will read from +the overrides, otherwise it will only consult the default palette +value. The =THEME= argument specifies which theme's palette to use. +In the absence of =THEME=, the current one is used. + +I already had the "get colour" functionality internally, but was +inspired to make it public after checking Sacha Chua's blog post +"Making highlight-sexp follow modus-themes-toggle": +<https://sachachua.com/blog/2023/01/making-highlight-sexp-follow-modus-themes-toggle/>. +Sacha was using a private function from the themes, which would have +been problematic if I would ever move things around. + +Remember to read the documentation of ~modus-themes-list-colors~. +That command shows a preview of the named colours. When called with a +prefix argument (=C-u= by default), it shows a preview of the semantic +colour mappings. + +** Option to disable other themes while loading Modus +:PROPERTIES: +:CUSTOM_ID: h:5af072da-38f6-44d0-9342-e799f0196006 +:END: + +In the past, we used to disable all other themes while loading a Modus +theme. I revised this for version 4 because I learnt that some users +use "themes" as bundles of arbitrary configurations. + +With the addition of the ~modus-themes-disable-other-themes~ user +option, which is non-nil by default, I am restoring the old behaviour: +when loading a Modus theme all other themes are disabled. + +This happens when the theme is loaded with the commands +~modus-themes-toggle~ and ~modus-themes-select~, or via Lisp with the +function ~modus-themes-load-theme~. + +Users who need to run multiple themes can set this option to a nil +value. (Personally, I use minor modes for such stylistic bundles and +never have to worry about ~(mapc #'disable-theme custom-enabled-themes)~.) + +Thanks to Tony Zorman for the feedback on the mailing list, which led +me to the introduction of this user option: +<https://lists.sr.ht/~protesilaos/modus-themes/%3C874jtew0gp.fsf%40hyperspace%3E#%3C87bkne84d2.fsf@hyperspace%3E>. + +** Renamed the named colours for bg-{added,changed,removed}-intense +:PROPERTIES: +:CUSTOM_ID: h:d43ef5cb-10dd-4c33-9429-2289a5fb2506 +:END: + +They are now called ~bg-added-fringe~, ~bg-changed-fringe~, +~bg-removed-fringe~. Please update any palette overrides to reflect +this renaming. + +** Documented how to override diffs for more optional combinations +:PROPERTIES: +:CUSTOM_ID: h:220d4361-7245-4632-998e-c0e2ee3b5f7d +:END: + +The manual includes details (with copy-pastable code) on how to +achieve foreground-only diffs and/or how to have red+blue diffs +instead of the default red+green or the deuteranopia yellow+blue. + +Thanks to Andrew Tropin for requesting this feature. We used to +provide this style in earlier versions of the themes, but now it is +much more flexible. Andrew's request was done via a private channel +and the information is shared with permission. + +[ Since we are here, also thanks to Andrew for keeping the Guix + package of the Modus themes up to date. ] + +** Stylistic changes +:PROPERTIES: +:CUSTOM_ID: h:fdcff629-22c1-4203-9104-4f732c59f731 +:END: + +- Guaranteed consistency between all of the line-related faces of the + ~consult~ package. We use the ~shadow~ face in all interfaces where + line numbers are contextual information (Occur, Grep,...). With + Consult, this was not the case for commands like ~consult-line~. + + Thanks to Daniel Mendler (also known as @minad) for bringing this + matter to my attention: + <https://lists.sr.ht/~protesilaos/ef-themes/%3Cb03413a6-cb77-615d-145d-db4eb710bfca%40daniel-mendler.de%3E>. + +- Refined all diff colours for fringes and reduced the saturation for + added lines in ~modus-operandi-deuteranopia~, ~modus-vivendi-deuteranopia-theme~. + Thanks to Andrew Tropin for showing me some usability issues with + the previous styles. This was done via a private channel and the + information is shared with permission. + +- Instructed the ~dashboard~ icons to retain their underlying colour. + The default value of the ~dashboard-items-face~ made all icons use + the same colour, detracting from their distinctiveness. Thanks to + Thanos Apollo for bringing this matter to my attention. It was done + via a private channel and the information is shared with permission. + +- Amplified the intensity of the =#+begin_src= text when the user + option opts for ~(setq modus-themes-org-blocks 'gray-background)~. + The text is now easier to discern. That user option makes the + inside of the block have a gray background and the begin/end lines + to have a more intense gray, giving off a "blocky" impression. + +- Made the ~compilation-warning~ face also inherit the + ~modus-themes-bold~ face. This means that it responds to the value + of the user option ~modus-themes-bold-constructs~, the same way the + other compilation-related mode line faces do. Thanks to Manuel + Giraud for informing me about the inconsistency in + ~compilation-warning~. This was done via a private channel and the + information is shared with permission. + +- Calibrated the hueness of the "nuanced" backgrounds in the + ~modus-operandi-tinted~ and ~modus-vivendi-tinted~ themes. These + tweaks are necessary to retain thematic consistency. + +- Reset ~mu4e-header-highlight-face~ to its intended style. I made a + mistake before: I did not want the ~highlight~ face to be used in + this case as it is too intense. Sorry! + +- Toned down the highlight line of the ~ctrlf~ and ~swiper~ packages. + I mistakenly used the ~highlight~ before, which is too intense for + the purposes of an ancillary background colour. + +- Applied "nuanced" backgrounds to the tinted Org blocks. This fixes + an error of mine where I amplified the background colouration of Org + blocks. This concerns the case where the user option + ~modus-themes-org-blocks~ has a =tinted-background= value. Thanks + to Mark Bestley for informing me about this in issue 60 on the + GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/60#issuecomment-1374530488>. + +- Removed the hardcoding of the ~italic~ style in three faces, opting + instead to make them subject to the user option ~modus-themes-italic-constructs~. + The faces are ~marginalia-documentation~, ~markup-attribute-face~, + and ~org-agenda-calendar-sexp~. + +- Tweaked the Org agenda deadline and today schedule to use a bold + weight only when the user option ~modus-themes-bold-constructs~ is + set to a non-nil value. Thanks to Marko Kocic for reporting an + issue that brought this matter to my attention: + + - <https://lists.sr.ht/~protesilaos/modus-themes/%3C35588839.256749.1673272214728%40office.mailbox.org%3E> + - <https://lists.sr.ht/~protesilaos/modus-themes/%3C874jszvk5g.fsf%40protesilaos.com%3E> + - <https://lists.sr.ht/~protesilaos/modus-themes/%3C87ilhfu101.fsf%40protesilaos.com%3E> + +- Enforced the main foreground colour in the faces =highlight= and + =secondary-selection=. This should have always been there to avoid + awkward colour combinations. I realised it was missing after + corresponding with Edgar Vincent on a relevant topic: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C878ri95h1q.fsf%40posteo.net%3E#%3C87ilhc7usc.fsf@posteo.net%3E>. + +- Made the ~eglot-mode-line~ face conditionally bold, by subjecting it + to the user option ~modus-themes-bold-constructs~. + +- Ensure that the background of the ~company~ package's popup is the + same as that of the ~corfu~ package. This is a subtle neutral + value. + +- Fixed the hue of the ~org-habit~ "ready" faces. It should be green + and I made a mistake here. The ~modus-operandi-deuteranopia~ and + ~modus-vivendi-deuteranopia~ themes do change the underlying hues + though, as green is not suitable for them. + +- Simplified the ~keycast~ faces so that (i) they do not use a =:box= + attribute that can look awkward in some cases and (ii) the name of + the given command is not colourised to avoid exaggerations with the + use of colour. + +- Made the ~powerline-active1~ face inherit from ~mode-line~ instead + of ~mode-line-active~. The latter only exists in newer versions of + Emacs and we do not want to make the themes break in older versions. + Thanks to TitusMu for identifying this and reporting it in issue 64 on + the GitHub mirror: <https://github.com/protesilaos/modus-themes/issues/64>. + +- Decoupled all ~ediff~ faces from their ~diff-mode~ counterparts. + Ediff does not depend on ~diff-mode~, so we want to make each set of + faces stand on its own. Thanks to Bernd Rellermeyer for pointing + out this implicit dependency in issue 68 on the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/68>. + +** Miscellaneous +:PROPERTIES: +:CUSTOM_ID: h:14d1f1b0-00e0-4275-a06c-9e34daf6411a +:END: + +- Improved the clarity and robustness of the code that does the work + of ~modus-themes-list-colors~. + +- Refined the colour value of the =blue-warmer= named colour for all + the light themes. It is a tiny bit darker than before. + +- Introduced a ~t~ fallback value for the user option + ~modus-themes-completions~. It makes it easier to apply the same + styles for the selection line and matching characters. + +- Documented how to not extend the active region background. + +- Explained how to make tabs more or less colourful by using palette + overrides. + +- Removed obsolete and redundant statements from the documentation the + user option ~modus-themes-completions~. There was (i) an outdated + reference to the =background= value, which is no longer supported, + and (ii) a statement about the standard Completions' buffer that was + not useful. Thanks to Rudolf Adamkovič for informing me about this: + <https://lists.sr.ht/~protesilaos/modus-themes/%3Cm2tu1211qz.fsf%40me.com%3E>. + +- Rephrase the statement ="*Completions* buffer"= in the documentation + in the interest of clarity. Thanks to Rudolf Adamkovič for the + suggestion: + <https://lists.sr.ht/~protesilaos/modus-themes/%3Cm2tu1211qz.fsf%40me.com%3E#%3Cm2eds43htz.fsf@me.com%3E>. + +- Updated the sample configuration of the themes with ~use-package~ in + the interest of simplicity. Thanks to Sergey Nichiporchik for the + contribution. Sergey's contribution is within the ~15 line limit + and thus does not require copyright assignment to the Free Software + Foundation. + + This was done in merge request 59 on the GitLab mirror: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/59>. + + The prepatory discussion took place in issue 310 on the same mirror: + <https://gitlab.com/protesilaos/modus-themes/-/issues/310>. + + Weeks later I further simplified the relevant samples for the sake + of uniformity with the generic package setup. Thanks to Zoltan + Kiraly for informing me about the fact that the ~:bind~ keyword + delays the load of the package until the given command is invoked: + <https://github.com/protesilaos/modus-themes/pull/67>. + + Streamlining the configuration makes it easier for me to propose one + set of basic configurations without the need to know what a + configuration macro is doing behind the scenes. + +- Fixed an example colour in the documentation. Thanks to Russell Sim + for spotting the error of me using =bg-blue= instead of + =bg-blue-intense=: + <https://lists.sr.ht/~protesilaos/modus-themes/%3Cyger0wa9gsn.fsf%40simopolis.xyz%3E>. + +- Defined the missing =modus-themes-nuanced-{red,green,yellow,blue,magenta,cyan}= faces. + Those are used internally to avoid repetition, though users can also + rely on them for their personal configurations (same for all other + Modus faces). + +- Improved the documentation on how to have a borderless mode line + style by using the palette overrides. + +- Updated the manual's entry on the ~pdf-tools~ backdrop to make it + use the new conventions that have been in place since version 4 of + the themes. Thanks to Utkarsh Singh for the patches: + <https://lists.sr.ht/~protesilaos/modus-themes/patches/37902>. + +- Add an explicit notice that the version of the themes that is built + into Emacs must use the ~require-theme~ function instead of the + familiar ~require~. Built-in themes are not considered "code", due + to old conventions, and are not part of the ~load-path~ that + ~require~ reads from. This is not up to the theme to decide. + Interested users must simply know about this important technicality. + Thanks to Koen van Greevenbroek for reporting the problem that + helped me identify this issue: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C31038fd76868fa3d07c9a429dfed8fd6ac374bb8.camel%40posteo.net%3E>. + +- Clarified the wording of the ~modus-themes-with-colors~ setup for + custom faces. It explains when this macro should be called. Thanks + to user bangedorrunt for the feedback in issue 59 on the GitHub + mirror: <https://github.com/protesilaos/modus-themes/issues/59>. + +* 4.0.0 +:PROPERTIES: +:CUSTOM_ID: h:cd353ccc-daf5-4ee5-885a-b3f21be92b66 +:END: + +This is the biggest release in the history of the project. +Previously, a new version would consist of about 100 commits to the +Git repository. This one includes 400+ of them in the span of one +month. The out-of-the-box looks of the themes are largely the same as +before, though I have made a lot of internal changes that affect how +the themes are instantiated and customised. + +As part of this development cycle, I produced publications informing +users of the upcoming changes, while demonstrating the new feature of +overriding the colour palette and its semantic mappings. + +- 2022-12-03 Emacs: breaking changes coming to 'modus-themes' version 4 :: <https://protesilaos.com/codelog/2022-12-03-modus-themes-v4-development/> +- 2022-12-07 Emacs: change colour values and mappings in Modus themes version 4 :: <https://protesilaos.com/codelog/2022-12-07-modus-themes-4-colour-values-mappings/> +- 2022-12-17 Emacs: modus-themes version 4 demo [video] :: <https://protesilaos.com/codelog/2022-12-17-modus-themes-v4-demo/> +- 2022-12-28 Emacs: note for MELPA or Git users of the Modus themes ahead of version 4 :: <https://protesilaos.com/codelog/2022-12-28-note-modus-themes-4-melpa/> + +I did this in the hope of preparing users for the refactored Modus +themes, though I understand that not everyone has had the chance to +consult those entries. The general idea is that *old custom code will +not work* and most user options are either removed or confined to a +more precise scope. + +Custom code will not work because the named colours of the palettes +have changed. Many user options are made redundant by the new +overrides' system. Specifically, if an option pertains to +colouration, it is now done via overrides instead of the old method of +me hardcoding styles (e.g. for stuff like "rainbow" headings). + +More details below. This is a long entry. Please take your time to +study it before upgrading to the new version of the themes. + +** There now are six Modus themes for more legibility needs +:PROPERTIES: +:CUSTOM_ID: h:f305dd08-a713-4369-a16d-af9403ab6c22 +:END: + +Quoting from the manual's "Overview" section: + +#+begin_quote +The Modus themes consist of six themes, divided into three subgroups. + +- Main themes :: ~modus-operandi~ is the project's main light theme, + while ~modus-vivendi~ is its dark counterpart. These two themes are + part of the project since its inception. They are designed to cover + a broad range of needs and are, in the opinion of the author, the + reference for what a highly legible "default" theme should look + like. + +- Tinted themes :: ~modus-operandi-tinted~ and ~modus-vivendi-tinted~ + are variants of the two main themes. They slightly tone down the + intensity of the background and provide a bit more color variety. + ~modus-operandi-tinted~ has a set of base tones that are shades of + light ochre (earthly colors), while ~modus-vivendi-tinted~ gives a + night sky impression. + +- Deuteranopia themes :: ~modus-operandi-deuteranopia~ and its + companion ~modus-vivendi-deuteranopia~ are optimized for users with + red-green color deficiency. This means that they do not use red and + green hues for color-coding purposes, such as for diff removed and + added lines. Instead, they implement colors that are discernible by + users with deueteranopia or deuteranomaly (mostly yellow and blue + hues). +#+end_quote + +All six themes will be included in Emacs 30 (~modus-operandi~ and +~modus-vivendi~ are in Emacs since August 2020). I asked about it on +the emacs-devel mailing list and received the approval of Eli +Zaretskii, one of the Emacs maintainers. The full thread: +<https://lists.gnu.org/archive/html/emacs-devel/2022-12/msg00834.html>. + +*** New command to select one of the Modus themes +:PROPERTIES: +:CUSTOM_ID: h:e4f011c4-46d3-4e4f-ad3e-9a609ef8bd5e +:END: + +The ~modus-themes-select~ command uses minibuffer completion to load +one of the six themes in the collection. Loading a Modus theme +disables all other Modus themes. + +NOTE that Emacs can load multiple themes, which typically produces +undesirable results and undoes the work of the designer. Use the +~disable-theme~ command if you are trying other themes beside the +Modus collection. + +*** New user option to specify themes to toggle +:PROPERTIES: +:CUSTOM_ID: h:c4efdaca-505b-4724-81b4-4a5340cbcaba +:END: + +The ~modus-themes-to-toggle~ is a variable that affects the command +~modus-themes-toggle~. By default, the toggling happens between the +~modus-operandi~ and ~modus-vivendi~ themes, as was always the case. +Though with the addition of new themes, it is possible to change this +to something like: + +#+begin_src emacs-lisp +(setq modus-themes-to-toggle '(modus-operandi-deuteranopia modus-vivendi-deuteranopia)) +#+end_src + +If ~modus-themes-to-toggle~ does not specify two Modus themes, the +~modus-themes-toggle~ command will prompt with completion for a theme +among the collection (this is practically the same as the aforementioned +~modus-themes-select~ command). + +** Colour palettes and their overrides are much more powerful +:PROPERTIES: +:CUSTOM_ID: h:c20673d3-d992-4827-bd24-80329962dc8e +:END: + +In previous versions, there were options to override colour values. +Those were difficult to use as they (i) required expertise on picking +the correct values and (ii) it was not clear which colour was used +where. + +The new version broadens the colour palette to include *named colours* +and *semantic colour mappings*. Named colours are associations +between a symbol and a colour value, such as =(blue-warmer "#354fcf")=. +While semantic colour mappings apply those named colours to specific +constructs such as =(heading-2 yellow-faint)= for all level 2 headings. + +What this means is that overrides can now be targeted at semantic +mappings as well to refashion practically every aspect of the themes. +The manual provides lots of examples that can be copied and used +directly. For example, it is possible to change the sequence of +colours in headings so that, say, there is a colour-coding that +denotes depth. Links to relevant entries are included in this +document. + +The ~modus-themes-common-palette-overrides~ user option contains +entries that are shared between all the themes. While there also +exist theme-specific options such as ~modus-operandi-palette-overrides~. + +For technical insight into the palette overrides, consult the manual: +<https://protesilaos.com/emacs/modus-themes#h:34c7a691-19bb-4037-8d2f-67a07edab150>. + +For practical examples check "Stylistic variants using palette +overrides" and its subsections: +<https://protesilaos.com/emacs/modus-themes#h:df1199d8-eaba-47db-805d-6b568a577bf3>. + +** Preset overrides for faint or intense colouration +:PROPERTIES: +:CUSTOM_ID: h:5ba76bb2-9ca8-4202-aca3-31aaca239d94 +:END: + +The palette overrides are comprehensive and can be tweaked in a +detailed way. Still, users may prefer to use the presets for a +"faint" or "intense" style. These presets showcase the new feature by +styling elements that were previously not subject to configuration. +They also provide the convenience of a common set of stylistic +patterns. + +Read the "Palette override presets" section in the manual for how to +use and/or extend those: +<https://protesilaos.com/emacs/modus-themes#h:b0bc811c-227e-42ec-bf67-15e1f41eb7bc>. + +** Named colours are more meaningful +:PROPERTIES: +:CUSTOM_ID: h:94e59644-8ef8-4a46-9666-a241ba04b21a +:END: + +In the past, the variants of the main accent colours were named like: + +- =red= +- =red-alt= +- =red-alt-other= + +The improved naming scheme changes those to: + +- =red= +- =red-warmer= +- =red-cooler= + +Semantically, the "warmer" variants have more yellow or red while the +"cooler" ones have greater contribution of cyan or blue. As such, the +user can expect =green-warmer= to be an olive green and =green-cooler= +to be that of the pine (though olive trees can have blue-green +colouration and pine trees can be "warmer", but I digress). + +Named colours can be previewed with the commands +~modus-themes-list-colors~ (alias ~modus-themes-preview-colors~) and +~modus-themes-list-colors-current~ (alias +~modus-themes-preview-colors-current~). + +Those commands accept a =C-u= prefix argument, in which case they show +the semantic colour mappings. + +** Rationalisation of the colour palette +:PROPERTIES: +:CUSTOM_ID: h:cb378214-54a1-4b5b-a801-aa206b94ae38 +:END: + +In previous versions, there were a lot of named colours that were +added ad-hoc, such as =fg-special-cold= and =bg-special-calm-faint=. +There was no clear design pattern behind them, nor was it obvious +where those colours should be used. Furthermore, there were colours +that were reserved for the various permutations of user options. + +This was too complex for users who wanted/needed to refashion aspects +of the themes. It was also difficult to maintain. + +The new palettes are more streamlined and their application is more +predictable. This only matters to users who tweak the themes: it +makes their life easier, although it does render inapplicable any +previous custom code. + +** Deprecation of user options +:PROPERTIES: +:CUSTOM_ID: h:fcaa0f80-7e78-44b1-ab04-90acb0046139 +:END: + +The following subsections explain the topics in further detail. The +general idea for this change is that palette overrides provide a more +powerful, more flexible, and less complex alternative. The code base +is considerably smaller. + +With overrides, I can now provide support to cases such as: + +- Users who need different sets of greys as their monitor has + inadequate colour reproduction (this is much more common than you + think). +- Users who want to make individual elements stand out, such as to + turn the delimiters of Org source blocks (the =#+begin_src= and + =#+end_src= lines) into, say, a shade of red. +- Users who want to tone down the =TODO= and =DONE= keywords while + making headings more colourful. Or the inverse, or any combination + in-between the extremes. +- Users who want Org property drawers to be more colourful but inline + code to be faint. + +You get the idea... All these and many more are now possible. +Whereas in the past I would either have to tell people that it is not +possible or hardcode a stylistic alternative via user options, thus +further complicating the code base. + +Catering to all those use-cases is important due to the maximalist +scope of the Modus themes: I cannot tell people to use another theme, +because here is where they come for their legibility needs. This is +consistent with my experience that accessibility is not a +one-size-fits-all and that the most accessible design is that which is +flexible, ceteris paribus. + +*** ~modus-themes-intense-mouseovers~ +:PROPERTIES: +:CUSTOM_ID: h:7f4a658a-613b-4ab9-bc05-d9aa6179830b +:END: + +This user option would amplify the background colour of mouse hover +effects (technically, the ~highlight~ and ~mode-line-highlight~ +faces). It always used a blue colour. + +The same effect can now be achieved via overrides, except it is now +possible to use any background colour or level of intensity that is +provided by the themes' palette. The manual provides concrete +examples: <https://protesilaos.com/emacs/modus-themes#h:b5cab69d-d7cb-451c-8ff9-1f545ceb6caf>. + +*** ~modus-themes-org-agenda~ +:PROPERTIES: +:CUSTOM_ID: h:778abb81-4bcb-4a5c-85eb-eec9f417a443 +:END: + +This was a complex user option that was hard to test, document, and +maintain. Most aspects of the Org agenda can be affected via +overrides, as demonstrated in the manual: +<https://protesilaos.com/emacs/modus-themes#h:a5af0452-a50f-481d-bf60-d8143f98105f>. + +*** ~modus-themes-fringes~ +:PROPERTIES: +:CUSTOM_ID: h:b1ee38d7-45a0-474b-8c97-774f61462cc6 +:END: + +This user option provided two shades of grey and the option for an +invisible background for the Emacs fringe. The same and better can be +done via overrides, as shown in the manual: +<https://protesilaos.com/emacs/modus-themes#h:c312dcac-36b6-4a1f-b1f5-ab1c9abe27b0>. + +*** ~modus-themes-lang-checkers~ +:PROPERTIES: +:CUSTOM_ID: h:ad06917b-a078-48c8-97e8-1182e085a15c +:END: + +This was another complex user option that offered several stylistic +variants of dubious value. The main problem it had is that linter +highlights are often applied automatically, so any super intense style +becomes unusable. Same when a file has lots of warnings/errors. + +The semantic colour mappings I provide for this case are limited to +underlines, which I think is the most usable/legible design. The +manual provides concrete examples on how to tweak those: +<https://protesilaos.com/emacs/modus-themes#h:03dbd5af-6bae-475e-85a2-cec189f69598>. + +*** ~modus-themes-mode-line~ +:PROPERTIES: +:CUSTOM_ID: h:1b82b764-97f5-406a-8440-bae415c7d294 +:END: + +Yet another very complex user option that I removed in the interest of +maintainability. All its stylistic permutations (and more) for +colours are possible via overrides: + +- Make the mode line borderless :: <https://protesilaos.com/emacs/modus-themes#h:80ddba52-e188-411f-8cc0-480ebd75befe> +- Make the active mode line colorful :: <https://protesilaos.com/emacs/modus-themes#h:e8d781be-eefc-4a81-ac4e-5ed156190df7> + +It is also possible to add padding to the mode line, though I explain +why this was always a dirty hack: +<https://protesilaos.com/emacs/modus-themes#h:5a0c58cc-f97f-429c-be08-927b9fbb0a9c>. + +*** ~modus-themes-diffs~ +:PROPERTIES: +:CUSTOM_ID: h:dd2879a4-37c1-4ded-bc7e-24a217248961 +:END: + +I have redesigned all diff-related colours to improve their usability. +They are less intense than before, but still stand out clearly. I am +purposefully not documenting how to use overrides here as I want users +to give this redesign a try. We can always document and refine things +at a later point. + +*** ~modus-themes-subtle-line-numbers~ +:PROPERTIES: +:CUSTOM_ID: h:bcce1b94-a223-4324-b0a6-940e389819a8 +:END: + +This was a simple, but ultimately very limited option. We can do much +better with overrides because we can tweak every aspect of this +interface without making the code more complex. The manual shows how +to do it in style: +<https://protesilaos.com/emacs/modus-themes#h:b6466f51-cb58-4007-9ebe-53a27af655c7>. + +*** ~modus-themes-markup~ +:PROPERTIES: +:CUSTOM_ID: h:5eedfd24-9480-4b76-8b64-e625d3220a8d +:END: + +This was a poorly named user option that only affected inline code +elements in prose. The new semantic colour mappings provide more +points of entry and thus make it easier to tweak things to one's +liking (including tables, property drawers, source block delimiters +(the =#+begin_src= and =#+end_src= lines)), and more. The manual +shows how: +<https://protesilaos.com/emacs/modus-themes#h:bb5b396f-5532-4d52-ab13-149ca24854f1>. + +*** ~modus-themes-paren-match~ +:PROPERTIES: +:CUSTOM_ID: h:8dbe54c3-5bfc-424c-8952-f68015f6c6c4 +:END: + +The colouration of matching parentheses of the ~show-paren-mode~ can +still be affected via overrides: +<https://protesilaos.com/emacs/modus-themes#h:259cf8f5-48ec-4b13-8a69-5d6387094468>. + +*** ~modus-themes-syntax~ +:PROPERTIES: +:CUSTOM_ID: h:22910131-87bf-4c03-bbf4-aac3010b570a +:END: + +This was a user option that controlled the colouration of programming +modes. We can reproduce it with overrides, except we now also have +the freedom to adapt things further: + +- Make comments yellow and strings green :: <https://protesilaos.com/emacs/modus-themes#h:26f53daa-0065-48dc-88ab-6a718d16cd95> +- Make code syntax use the old alt-syntax style :: <https://protesilaos.com/emacs/modus-themes#h:c8767172-bf11-4c96-81dc-e736c464fc9c> +- Make use of alternative styles for code syntax :: <https://protesilaos.com/emacs/modus-themes#h:943063da-7b27-4ba4-9afe-f8fe77652fd1> + +*** ~modus-themes-links~ +:PROPERTIES: +:CUSTOM_ID: h:68d41ee9-d277-45f9-a6cd-543dac9282c8 +:END: + +The colouration of links can now be affected via palette overrides, as +documented in the manual: +<https://protesilaos.com/emacs/modus-themes#h:6c1d1dea-5cbf-4d92-b7bb-570a7a23ffe9>. + +*** ~modus-themes-region~ +:PROPERTIES: +:CUSTOM_ID: h:b97b78df-9ed9-4173-8de2-303851231e06 +:END: + +Overrides can be used to affect the region's colouration and/or to +prevent the active region highlight from changing the underlying text +colour. As always, the manual covers the details: +<https://protesilaos.com/emacs/modus-themes#h:c8605d37-66e1-42aa-986e-d7514c3af6fe>. + +*** ~modus-themes-deuteranopia~ +:PROPERTIES: +:CUSTOM_ID: h:e5fee2a1-2ace-4b4b-9aea-554d2b4a7c2d +:END: + +Instead of this rather limited option, users are advised to use the +new bespoke themes: ~modus-operandi-deuteranopia~ and +~modus-vivendi-deuteranopia~. They are designed to cater to the needs +of people with red-green colour deficiency. + +*** ~modus-themes-mail-citations~ +:PROPERTIES: +:CUSTOM_ID: h:bb8a81c5-d0c1-4150-bf7a-254d1684d95e +:END: + +All parts of an email composition buffer (per the standard +=message.el= library) are configurable via palette overrides. Not +just citation lines, but also message headers. The manual shows +several stylistic alternatives: +<https://protesilaos.com/emacs/modus-themes#h:7da7a4ad-5d3a-4f11-9796-5a1abed0f0c4>. + +Note that apart from this change, I also redesigned several faces that +affect emails. This was done in the interest of consistency and to +avoid some exaggerations. + +*** ~modus-themes-tabs-accented~ +:PROPERTIES: +:CUSTOM_ID: h:1574b5bc-d615-4053-9bbf-79396745519b +:END: + +I do not provide documentation on how to reproduce this style because +I think it was not widely used. It is possible to do it with +overrides. If anyone needs it, they are invited to contact me about +it. + +*** ~modus-themes-box-buttons~ +:PROPERTIES: +:CUSTOM_ID: h:19c81a75-a65e-49cb-83e5-c44167821865 +:END: + +All "graphical" buttons use a proportionately spaced font +(~variable-pitch~) by default as it helps with legibility. The +colours of those buttons can be changed by overriding the relevant +entries: +<https://protesilaos.com/emacs/modus-themes#h:4f6b6ca3-f5bb-4830-8312-baa232305360>. + +[ Use my ~fontaine~ package to affect fonts via faces and to apply + presets for various contexts. ] + +** Changes to remaining user options +:PROPERTIES: +:CUSTOM_ID: h:c93db0f4-1032-411a-881e-0c5fd23480cf +:END: + +*** The ~modus-themes-headings~ also affects the Org agenda +:PROPERTIES: +:CUSTOM_ID: h:c2f088b6-dc84-4285-9ece-c877be6b274f +:END: + +This user option applies to heading level 0 through 8 and also to the +agenda date and structure constructs. Here is a complete example: + +#+begin_src emacs-lisp +(setq modus-themes-headings ; read the manual's entry of the doc string + '((0 . (variable-pitch light 1.9)) + (1 . (variable-pitch light 1.8)) + (2 . (variable-pitch regular 1.7)) + (3 . (variable-pitch regular 1.6)) + (4 . (variable-pitch regular 1.5)) + (5 . (variable-pitch 1.4)) ; absence of weight means `bold' + (6 . (variable-pitch 1.3)) + (7 . (variable-pitch 1.2)) + (agenda-date . (semilight 1.5)) + (agenda-structure . (variable-pitch light 1.9)) + (t . (variable-pitch 1.1)))) +#+end_src + +*** The ~modus-themes-headings~ no longer affects colours +:PROPERTIES: +:CUSTOM_ID: h:bb0bac60-ad22-4699-9579-881431972294 +:END: + +All colour-related changes can be done via palette overrides. This +gives the user maximum flexibility on the choice of applied colours +(e.g. to have alternating contrasting foregrounds or shades of the +same hue). The manual shows several examples: +<https://protesilaos.com/emacs/modus-themes#h:11297984-85ea-4678-abe9-a73aeab4676a>. + +*** The ~modus-themes-completions~ is simpler +:PROPERTIES: +:CUSTOM_ID: h:0b29c525-7def-4149-a26b-70ca5e021a27 +:END: + +It no longer covers =popup= entries as distinct from =selection=. +This is because I revised all the applicable colours and faces to +consolidate styles. + +The =matches= and =selection= keys now read the same list of values. + +All changes to colours are done through palette overrides, as +demonstrated in the manual (again, far more flexible): +<https://protesilaos.com/emacs/modus-themes#h:d959f789-0517-4636-8780-18123f936f91>. + +*** The ~modus-themes-prompts~ is simpler +:PROPERTIES: +:CUSTOM_ID: h:7e5b9fea-b696-4e8a-bebe-a7fbb0eb460a +:END: + +This user option now only affects the typographic features of prompts. +It can read any font weight, as explained in its documentation. +Colours are influenced by semantic colour mappings in the palette and +can be overridden accordingly. The manual shows several styles: +<https://protesilaos.com/emacs/modus-themes#h:bd75b43a-0bf1-45e7-b8b4-20944ca8b7f8>. + +*** Auto-reload theme when configuring via Custom +:PROPERTIES: +:CUSTOM_ID: h:b26a2a1f-ee1e-4001-a3d0-4d4d7cb4fd5f +:END: + +The user option ~modus-themes-custom-auto-reload~ supersedes the old +~modus-themes-inhibit-reload~. It is now set to a non-~nil~ value by +default. + +We do this as a convenience for users who tweak theme settings via the +Custom UI and who do not know that all modifications to user options +require a theme re-load for changes to take effect. Read more in the +manual: +<https://protesilaos.com/emacs/modus-themes#h:9001527a-4e2c-43e0-98e8-3ef72d770639>. + +** Deprecation of public functions +:PROPERTIES: +:CUSTOM_ID: h:8167bf46-7a43-4b46-b2ed-a66e5d73bb96 +:END: + +The ~modus-themes-color~ and ~modus-themes-color-alts~ are deprecated. +Users are invited to concentrate on the ~modus-themes-with-colors~ +macro. The manual provides several examples on that front. + +The ~modus-themes-load-themes~ is no longer necessary due to the +refactoring of the code base. + +The ~modus-themes-load-operandi~ and ~modus-themes-load-vivendi~ are +superseded by the general ~modus-themes-load-theme~. It accepts the +symbol of a Modus theme as its argument. + +The command ~modus-themes-report-bug~ is no more. Just send an email +to the mailing list or to me privately. Find the information with +=M-x describe-package= and then specify =modus-themes=. +Alternatively, check my website: <https://protesilaos.com/contact>. + +** Removed support for some packages +:PROPERTIES: +:CUSTOM_ID: h:34ffc5ed-574d-44f1-8a27-c2e6bb8c69e0 +:END: + +These are the most notable packages that are no longer supported: + +- ~dired+~ +- ~lsp-mode~ +- ~helm~ +- ~treemacs~ + +The reason is that they are very hard to use for me as an outsider. +They provide lots of features, which means that I cannot easily +identify faces in their context unless I become an expert in the +relevant functionality. + +Other removed packages: + +- ~artbollocks-mode~. Use ~writegood-mode~. +- ~apropos~. Its default faces are fine. +- ~awesome-tray~. +- ~bbdb~ and ~ebdb~. They are hard to set up, but their faces are + usable. +- ~calfw~. Hard to set up and also seems to no longer be maintained. +- ~easy-jekyll~ +- ~dir-treeview~ +- ~eros~ +- ~eshell-git-prompt~ +- ~eshell-prompt-extras~ +- ~eshell-syntax-highlighting~ +- ~evil-goggles~ +- ~evil-snipe~ +- ~evil-visual-mark-mode~ +- ~fountain-mode~. I need someone who uses it to help me test it. +- ~macrostep~ +- ~mentor~ +- ~mini-modeline~ +- ~mmm-mode~. I need someone who uses it to help me test it. +- ~org-table-sticky-header~. +- ~phi-grep~ +- ~pomidor~ +- ~rainbow-blocks~. Use Adam Porter's (aka alphapapa) =prism.el=. +- ~semantic~ +- ~smartparens~ +- ~spaceline~ +- ~sx~ +- ~telephone-line~ +- ~tomatinho~ +- ~winum~ +- ~xterm-color~. + +** Thanks for their feedback on the development of version 4 +:PROPERTIES: +:CUSTOM_ID: h:bdaa3eaf-67e8-4de8-b8d5-7b11fa28dbcd +:END: + +In alphabetical order: + +- Aleksei Pirogov :: Noticed that there were no semantic colour + mappings for the ~rainbow-delimiters~ (and related), thus reminding + me to make the requisite arrangements. Aleksei also spotted a + regression during the development of the "faint" overrides' preset. + These were done on the GitHub mirror: + + - <https://github.com/protesilaos/modus-themes/issues/54> + - <https://github.com/protesilaos/modus-themes/issues/55> + +- Anders Johansson :: Pointed out some irregularities with the use of + ~make-obsolete~ in the =version-4= development branch. I should be + using ~make-obsolete-variable~ in some cases: + <https://lists.sr.ht/~protesilaos/modus-themes/%3CCAKJdtO-dzvR%3D2BaSd5qPzwDE%3D%2BaJSR6js7ii1O6KD7oFOB7gDw%40mail.gmail.com%3E> + +- Charlotte Van Petegem :: Reminded me to document how to reproduce + the old "alt-syntax" style by using palette overrides: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C877cy917jw.fsf%40vanpetegem.me%3E> + +- Christian Tietze :: Spotted a bug in how shared palette overrides + would not be read in certain scenaria. Also suggested tweaks to the + documentation, which reminded me of tasks that still had to be done: + + - <https://lists.sr.ht/~protesilaos/modus-themes/%3Cm1cz81rq9m.fsf%40christiantietze.de%3E> + - <https://lists.sr.ht/~protesilaos/modus-themes/%3Cm1fscxrr0s.fsf%40christiantietze.de%3E> + - <https://lists.sr.ht/~protesilaos/modus-themes/%3Cm1ilhtrs09.fsf%40christiantietze.de%3E> + +- Daniel Mendler (aka @minad on GitHub) :: Contacted me to comment on + the general redesign. From the discussion I learnt that preset + overrides would be useful. This information is shared with + permission, as it was done via a private channel. + +- James Ferguson :: Commented on the colours of the tab-bar and thus + inspired me to define relevant semantic colour mappings: + <https://lists.sr.ht/~protesilaos/modus-themes/%3CCAMtGdSnrKDGdagT7vGC9DnBZnOvkbM%3D4Nxwn3ts2tdO8YmUnxw%40mail.gmail.com%3E> + +- Philip Kaludercic :: Opined that the ~modus-themes-inhibit-reload~ + should not be deprecated in the interest of usability. As noted + above, its functionality is preserved and now enabled by default in + ~modus-themes-custom-auto-reload~. Through the discussion we also + arrived at the concept of shared palette overrides instead of only + having theme-specific ones: + + - <https://lists.sr.ht/~protesilaos/modus-themes/%3C87h6y3gyxx.fsf%40posteo.net%3E> + - <https://lists.sr.ht/~protesilaos/modus-themes/%3C87wn6qgjkx.fsf%40posteo.net%3E> + +- Tony Zorman :: Noted that there was no clear upgrade path to + version 4. This helped me explain some of the technicalities of + packaging and of the themes' redesign, but also to update the + manual: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C874jtew0gp.fsf%40hyperspace%3E>. + +- a1ks :: Reported a bug caused by the typo of an extra backtick. + This was done on the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/53>. + +- soaringbind :: Identified some omissions in the code where I forgot + to update certain Avy and Org faces. This continued in a second + thread about the use of some obsolete faces: + + - <https://lists.sr.ht/~protesilaos/modus-themes/%3CNKXY2k1--3-9%40tuta.io%3E> + - <https://lists.sr.ht/~protesilaos/modus-themes/%3CNKd3jM_--3-9%40tuta.io%3E> + +- tumashu :: Experimented with the overrides and thus helped me + identify an area where the documentation could be improved. This + was done on the GitHub mirror: + + - <https://github.com/protesilaos/modus-themes/issues/56> + - <https://github.com/protesilaos/modus-themes/issues/57> + +- wakamenod :: Encountered a bug that was caused by a mistake of mine + that affected how themes are instantiated. This was done on the + GitHub mirror: <https://github.com/protesilaos/modus-themes/issues/50>. + +** The largest release to date +:PROPERTIES: +:CUSTOM_ID: h:54a6bcd1-6ba0-42ed-8fdd-b83ee3efee73 +:END: + +There are many more changes that I did not describe. This already +lengthy document is me covering just the headline features. The gist +is that I spent the last month refactoring and testing the themes to +ensure they can cope with the needs of users for years to come. + +I understand that the palette overrides are a new way of doing things +and that some users may be inconvenienced over the short-term as they +update their configurations. I strongly believe that this system is +better and the Modus themes can now cover all the legibility needs of +users, while also catering to their aesthetic preferences. + ++ Package name (GNU ELPA): ~modus-themes~ ++ Official manual: <https://protesilaos.com/emacs/modus-themes> ++ Change log: <https://protesilaos.com/emacs/modus-themes-changelog> ++ Colour palette: <https://protesilaos.com/emacs/modus-themes-colors> ++ Sample pictures: <https://protesilaos.com/emacs/modus-themes-pictures> ++ Git repo on SourceHut: <https://git.sr.ht/~protesilaos/modus-themes> + - Mirrors: + + GitHub: <https://github.com/protesilaos/modus-themes> + + GitLab: <https://gitlab.com/protesilaos/modus-themes> ++ Mailing list: <https://lists.sr.ht/~protesilaos/modus-themes> ++ Backronym: My Old Display Unexpectedly Sharpened ... themes + +* 3.0.0 +:PROPERTIES: +:CUSTOM_ID: h:6829db8d-52c5-43a8-a026-f213dcfaced9 +:END: + +#+begin_src text +Modus themes version 3.0.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2022-10-28 + + +The version that will ship with Emacs 29 +======================================== + +The 'modus-operandi' and 'modus-vivendi' themes (package name is +'modus-themes') have been a part of Emacs since August 2020. Emacs 28 +ships with version 1.6.0 of the themes. Emacs 29 will include version +3.0.0. + +There is no clean upgrade path from the old version of the themes to +the current one. Users are advised to review their configurations and +consult with the detailed manual of the themes. + +I am available to answer any questions, either via my personal email +or on the official sources of the themes. Find the full list here: +<https://protesilaos.com/emacs>. + + +Minor breaking changes +====================== + +I have changed the default value of the following user options: + +1. 'modus-themes-hl-line' +2. 'modus-themes-completions' +3. 'modus-themes-fringes' + +In the case of the first two, the background of the highlighted line +is made to look a bit more intense. + +For the fringes, this tweak makes them visible, using a subtle grey +colour. By default, "fringe" is an 8-pixel-wide area to the left and +right side of an Emacs window. + +The intent of these changes is to make the out-of-the-box experience +consistent with the accessibility considerations of the Modus themes. +Specifically because some users may not realise that the themes are +highly customisable. + +To revert to the old defaults, users must include this (or equivalent) +in their init file: + + (setq modus-themes-completions nil + modus-themes-hl-line nil + modus-themes-fringes nil) + +As always, changes to theme user options take effect upon a reload of +the theme. + +This was announced on my website: +<https://protesilaos.com/codelog/2022-10-23-breaking-modus-themes-3-0-0-notice/>. + + +Support for new faces or changes to existing ones +================================================= + +,* Refined the 'telega' faces for inline code and preformatted + elements. The faces are 'telega-entity-type-code' and + 'telega-entity-type-pre', respectively. This change makes them + subject to the style specified in the user option + 'modus-themes-markup'. + + Thanks to Pablo Stafforini for showing me screenshots of how they + look, as I am not a telega/telegram user and cannot do this myself. + Done as part of issue 170 on the GitLab mirror: + <https://gitlab.com/protesilaos/modus-themes/-/issues/170#note_1143975582>. + +,* Removed all attributes from the 'textsec-suspicious' face. By + default, it applies a background, but does not affect the + foreground. The result is thus inaccessible in many cases + (e.g. blue links against a red background). There is no need for + such a background though, as the warnings are accompanied by the + relevant emoji: ⚠️. + + To support this face, we need it to affect the foreground as well. + +,* Deleted some 'consult' "preview" faces in the interest of + consistency. This is to match the current style of the project: + <https://github.com/minad/consult/commit/1343e39fefcf8a28a7a415aa4b0a8ff7094370bf>. + +,* Expanded support of the built-in 'diff-mode' faces to include the + 'diff-changed-unspecified'. It is made to look the same as + 'diff-changed', i.e. yellow-tinted. There is a good chance that a + user will never see this face in action (I only encountered it + once). + +,* Reworked all the 'highlight-regexp' faces (like 'hi-yellow') to use + bespoke colour values. + + These faces need to have a background that is consistent with their + semantics. Furthermore, they need to use the 'inverse-video' + attribute which, in turn, affects the combinations of colour we can + apply. Our accented backgrounds are designed to contrast well with + our nominal main foreground values, whereas this case demands + coloured backgrounds that contrast nicely with what would normally + be the main background colour. As such, we cannot apply our + ordinary entries from each theme's palette. It would be inefficient + to expand the palette of each theme just for this edge case. + + Thanks to Kevin Kainan Li for the feedback on the mailing list, where + they informed me that the previous design was too dark/mute (and I + agreed with that assessment) and provided feedback on my samples: + <https://lists.sr.ht/~protesilaos/modus-themes/%3CCAMTq2Vp3Nnzv-i9wJdq4-OJ4X_QfWXySpUtAieBy0dgKLEOSBg%40mail.gmail.com%3E>. + +,* Recoloured the 'modus-themes-completion-match-1' to use a shade of + blue instead of cyan. This contributes to the distinctiveness of + those matches relative to 'modus-themes-completion-match-0' and the + other groups. These faces are used in completion User Interfaces, + such as 'vertico', 'corfu', 'orderless'. They are subject to the + user option 'modus-themes-completions'. + +,* Added support for the 'olivetti-fringe' face. Its background is the + same as the main background, meaning that the fringes are invisible + when 'olivetti-mode' is enabled. Thanks to Matthias Fuchs for + producing a report that helped me track this problem. It was done + in issue 46 on the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/46>. + + +Miscellaneous +============= + +,* Added the new Emacs 29 theme properties to 'modus-operandi' and + 'modus-vivendi'. These make the themes work with the new built-in + command 'toggle-theme'. Thanks to Philip Kaludercic for the patch + and for the work on this in emacs.git: + <https://lists.gnu.org/archive/html/bug-gnu-emacs/2022-10/msg00886.html>. + +,* Refrained from deprecating the 'modus-themes-toggle' command in + favour of the new generic 'toggle-theme'. + + The 'toggle-theme' is not functionally equivalent to the command + 'modus-themes-toggle' due to the optional arguments it accepts. + With 'toggle-theme' we are prompted to confirm loading the theme, + due to how unsafe themes can be... Further, we are asked to add the + loaded theme to the list of "safe" themes. This only applies to the + packaged version of the 'modus-themes', not the items that are built + into Emacs. + + These prompts are consistent with how 'load-theme' works, but not + with what the user of 'modus-themes-toggle' has come to expect. + + Users who do not like to maintain a 'custom-file' (like me) are thus + penalised each time they invoke the command. + + The 'modus-themes-toggle' will only be deprecated if there is, say, + a user option in Emacs that disables those prompts each time a theme + is loaded. Basically, we need an arrangement that just toggles + themes without questions. + + Thanks to Rudolf Adamkovič for suggesting the idea and to Philip + Kaludercic for the 'toggle-theme' (and related functionality): + <https://lists.sr.ht/~protesilaos/modus-themes/%3C877d116lh4.fsf%40posteo.net%3E#%3Cm2lepgrd8l.fsf@me.com%3E>. + +,* Corrected the one-line description of the 'modus-vivendi' theme, + which was describing itself as a "light" theme. + +,* Ensured that the manual and all doc strings in the code use American + English, per the convention of emacs.git (my CHANGELOG still uses + what I prefer). Thanks to Stefan Kangas for contributing to this + effort with a patch that properly renders 'non-nil' in the texinfo + output as 'non-@code{nil}'. + +,* Made other minor tweaks and refinements. +#+end_src + +* 2.7.0 +:PROPERTIES: +:CUSTOM_ID: h:4d86106c-1df5-4f5f-bc6c-f14f5d13403b +:END: + +#+begin_src text +Modus themes version 2.7.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2022-10-01 + + +Support for packages or faces +============================= + +,* Reinstated support for 'centaur-tabs'. I had removed it in commit + 2235ce5 (done on 2022-08-02) for version 2.5.0 of the modus-themes. + At the time I wrote: + + centaur-tabs has a bug where it cannot read the value of a face if it + uses the standard ':inherit' attribute. I have sent a patch to fix it, + but have received no response since February: + <https://github.com/ema2159/centaur-tabs/pull/179>. + + Relevant reports: + + - <https://github.com/protesilaos/modus-themes/issues/30> + - <https://gitlab.com/protesilaos/modus-themes/-/issues/288> + - <https://github.com/protesilaos/modus-themes/issues/15> + + I am happy to reinstate support for centaur-tabs as soon as the package + gets the maintenance it needs. + + My patch/pull-request is now merged and the package is actively + maintained once again. Hence the decision to bring back support for + it, as promised. + +,* Applied styles for the 'icon-button' face of Emacs 29. + + +,* Styled the 'log-edit-headers-separator' face of Emacs 29 (it was + introduced upstream by a patch of mine). + +,* Made the 'gnus-summary-low-unread' face inherit from the 'italic' + face like the rest of that subgroup of faces. This helps + differentiate it from the 'gnus-summary-high-unread' face. Thanks + to Mark Simpson for pointing out the possibility of conflating those + two faces: <https://lists.sr.ht/~protesilaos/modus-themes/%3Cm2r0zszc2z.fsf@gmail.com%3E>. + +,* Covered the 'read-multiple-choice-face' by adding a noticeable + background colour to it. The default attributes it has, which look + like other key bindings (bold and blue) plus an underline are + technically okay, though the context of this face is in the echo + area which is one line tall. Moreover, the highlighted keys are + inlined with other text. These make it difficult to spot the + highlights without some extra spacing. I use the addition of a + background in Org's export dispatcher interface which also has some + unique requirements (the 'org-dispatcher-highlight' face). The + principle is to have theme-wide consistency (e.g. "all key bindings + must look the same") EXCEPT when the specifics require a different + set of styles in the interest of usability. + +,* Extended the coverage of the 'auctex' package's faces to include the + 'font-latex-underline-face'. Thanks to Luis Miguel Castañeda for + reporting a typo I made which caused an error: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C7h7d2oudpb.fsf@imaginarymagnitude.net%3E> + +,* Added support for 'crontab-mode'. Thanks to Antonio Ruiz for the + patch: <https://lists.sr.ht/~protesilaos/modus-themes/patches/35080>. It + is below the ~15 line threshold and thus requires no copyright + assignment to the Free Software Foundation. + +,* Extended support for the 'company' package's 'company-scrollbar-bg' + and 'company-scrollbar-fg' faces. + +,* Added support for the 'spell-fu' package. Thanks to Antonio Ruiz + for the patch: <https://lists.sr.ht/~protesilaos/modus-themes/%3C87fshnq7uv.fsf%40purelymail.com%3E>. + Same as further above for Antonio's copyright status. + +,* Moved the 'selectrum-prescient' faces to the 'prescient' group, to + be consistent with changes in the respective upstream packages. + Thanks to okamsn for the contribution, which was done in pull + request 41 on the GitHub mirror: <https://github.com/protesilaos/modus-themes/pull/41>. + The user okamsn has assigned copyright assignment to the Free + Software Foundation, although this patch is within the allowed + limits. + + +Change to 'fill-column-indicator' +================================= + +Made the 'fill-column-indicator' face more noticeable. It is what the +'display-fill-column-indicator-mode' uses to draw a line on where the +'fill-column' is. + +This change is in response to private messages I received as well as +this, at parts impolite and toxic, thread that I refrained from +participating in: +<https://lists.gnu.org/archive/html/help-gnu-emacs/2022-08/msg00255.html>. + +[ I do not follow that mailing list, by the way. All my projects have + multiple communication channels and I always reply in a timely + fashion. Social media, fora about Emacs, generic mailing lists, + etc. are not among those channels. + <https://protesilaos.com/codelog/2022-07-24-report-issues-official-channels/>. ] + +The core idea is that the previous design was (1) considered +"invisible" and (2) it prevented the customisation of the user option +'display-fill-column-indicator-character'. + +I am addressing point 1, but point 2 puts us in an awkward spot as we +would then not be allowed to use a background and a height value. Not +doing so produces a dashed line by default, with the dashes further +apart the greater the line-spacing is (especially in, say, Org +headings that can have a greater height than paragraph text). It +looks broken and I keep getting requests to fix what is not the +themes' fault. So no, the themes will remain opinionated in this +regard by ignoring 'display-fill-column-indicator-character' through +the styling they apply to make the line contiguous. + +For context, also read Emacs bug#57424 and please don't take my words +in a private message out of context. If I need to state my opinion in +a public setting, I know how to do it. +<https://debbugs.gnu.org/cgi/bugreport.cgi?bug=57424>. + + +Refinement to modus-vivendi 'bg-diff-focus-removed' colour +========================================================== + +Made the default removed diff background slightly more luminant. The +colour is seen in diff-mode, ediff, and the Magit focused diff hunk. + +When the user option 'modus-themes-diffs' is set to either 'bg-only' or +'desaturated', this colour is used to highlight word-wise ("refined") +changes. The increased luminance lets it stand out more compared to the +more subtle backdrop. + +Thanks to Kévin Le Gouguec for bringing this issue to my attention and +for discussing it with me: +<https://lists.sr.ht/~protesilaos/modus-themes/%3C87bks4i9tg.fsf@gmail.com%3E> + + +Note about 'goto-address-mode' +============================== + +Quote from the manual: + + The built-in 'goto-address-mode' uses heuristics to identify URLs and + email addresses in the current buffer. It then applies a face to them + to change their style. Some packages, such as 'notmuch', use this + minor-mode automatically. + + The faces are not declared with 'defface', meaning that it is better + that the theme does not modify them. The user is thus encouraged to + consider including (or equivalent) this in their setup: + + (setq goto-address-url-face 'link + goto-address-url-mouse-face 'highlight + goto-address-mail-face 'link + goto-address-mail-mouse-face 'highlight) + + My personal preference is to set 'goto-address-mail-face' to nil, as + it otherwise adds too much visual noise to the buffer (email addresses + stand out more, due to the use of the uncommon '@' character but also + because they are often enclosed in angled brackets). + + +Changes to the manual +===================== + +,* Fixed a few typos and ensured that spelling using American English + as that is what emacs.git requires. + +,* Added the missing ':config' keywords from the example configuration + of the 'circadian' package. Thanks to Koen van Greevenbroek for the + patch: <https://lists.sr.ht/~protesilaos/modus-themes/%3C8735cb6zm3.fsf%40posteo.net%3E>. +#+end_src + +* 2.6.0 +:PROPERTIES: +:CUSTOM_ID: h:fc108f65-3e0b-4e28-8030-86c797cb2b25 +:END: + +#+begin_src text +Modus themes version 2.6.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2022-08-19 + + +Changes to supported faces or face groups +========================================= + +,* Made the 'font-lock-warning-face' adapt to comments. This changes the + face from a yellow to a red hue when the user adds a value to + 'modus-themes-syntax' which includes 'yellow-comments' property. + Before, this face was indistinguishable from yellow comments due to a + regression in version 2.5.0 of the themes. Thanks to Augusto Stoffel + and Manuel Uberti for their feedback on the mailing list: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C87r11k1c22.fsf%40gmail.com%3E>. + +,* Applied a consistent foreground color (a not-so-intense yellow hue) to + the 'org-checkbox' and 'markdown-gfm-checkbox-face'. The change comes + from the discussion on the mailing list where it became apparent that + a bit of colour is needed for such constructs: + <https://lists.sr.ht/~protesilaos/modus-themes/%3Cm2fsi9cja4.fsf%40me.com%3E>. + + Thanks to Rudolf Adamkovič, Christian Tietze, and Karthik Chikmagalur + for their participation. + +,* Added support for the 'mu4e-related-face'. Thanks to Simon Pugnet for + the feedback on the mailing list: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C87edxhvqwp.fsf@polaris64.net%3E>. + +,* Included support for the 'consult-preview-insertion' face. There are + two reasons for adding this: + + 1. It decouples it from the 'region' face, which means that the user + option 'modus-themes-region' no longer has an unintended effect on + it. + + 2. It makes it look consistent with the 'rectangle-preview' face (see + it in action with C-x SPC, move point down a few lines, type C-t + and then insert some text). I feel these sort of previews need to + look the same, though I don't have a strong attachment to the style + now in use. + + +Removed support for the 'solaire' package +========================================= + +The 'solaire-mode' package dims the background of what it considers +ancillary "UI" buffers, such as the minibuffer and Dired buffers. The +Modus themes used to support Solaire on the premise that the user was +(i) opting in to it, (ii) understood why certain buffers were more gray, +and (iii) knew what other adjustments had to be made to prevent broken +visuals (e.g. the default style of the 'modus-themes-completions' uses a +subtle gray background for the selection, which with Solaire becomes +practically invisible). + +However, the assumption that users opt in to this feature does not +always hold true. There are cases where it is enabled by default such +as in the popular Doom Emacs configuration. Thus, the unsuspecting user +who loads 'modus-operandi' or 'modus-vivendi' without the requisite +customizations is getting a sub-par experience; an experience that we +did not intend and cannot genuinely fix. + +[ Relevant reading about "The case of git-gutter, the modus-themes, and + Doom Emacs": + <https://protesilaos.com/codelog/2022-08-04-doom-git-gutter-modus-themes/> ] + +Because the Modus themes are meant to work everywhere, we cannot make an +exception for Doom Emacs and/or Solaire users. Furthermore, we shall +not introduce hacks, such as by adding a check in all relevant faces to +be adjusted based on Solaire or whatever other package. Hacks of this +sort are unsustainable and penalize the entire userbase. Besides, the +themes are built into Emacs and we must keep their standard high. + +The fundamental constraint with Solaire is that Emacs does not have a +real distinction between "content" and "UI" buffers. For themes to work +with Solaire, they need to be designed around that package. Such is an +arrangement that compromises on our accessibility standards and/or +hinders our efforts to provide the best possible experience while using +the Modus themes. + +As such, 'solaire-mode' is not---and will not be---supported by the +Modus themes (or any other of my themes, for that matter). Users who +want it must style the faces manually. Below is some sample code, based +on what we cover at length in the manual: + + (defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + `(solaire-default-face ((,class :inherit default :background ,bg-alt :foreground ,fg-dim))) + `(solaire-line-number-face ((,class :inherit solaire-default-face :foreground ,fg-unfocused))) + `(solaire-hl-line-face ((,class :background ,bg-active))) + `(solaire-org-hide-face ((,class :background ,bg-alt :foreground ,bg-alt)))))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) + + +Changes to the manual +===================== + +,* Added a missing parenthesis to a sample code block. Thanks to Paul + David for the contribution in pull request 39 on the GitHub mirror: + <https://github.com/protesilaos/modus-themes/pull/39>. + +,* Clarified the wording of individual statements pertaining to the need + of reloading a theme for changes to user options to become effective. +#+end_src + +* 2.5.0 +:PROPERTIES: +:CUSTOM_ID: h:32438044-6eee-4909-8e5a-860ce1457049 +:END: + +#+begin_src text +Modus themes version 2.5.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2022-08-03 + +This entry documents the changes made to the project since the +publication of version 2.4.0 on 2022-06-01. It spans more than 60 +commits to an already stable project. + +The 'modus-operandi' and 'modus-vivendi' themes are built into Emacs-28 +(latest stable release) or later, and are available on GNU ELPA as well +as other archives. Emacs-28 ships version 1.6.0, while the current +'master' branch (i.e. Emacs-29) and, by extension, GNU ELPA include the +latest tagged release. The packaged version is available as +'modus-themes'. + +Read the manual inside Emacs by evaluating: + + (info "(modus-themes) Top") + +Or visit: <https://protesilaos.com/emacs/modus-themes> (the website only +documents the latest version). + + +Enhancement to the user option 'modus-themes-headings' +====================================================== + +The user option 'modus-themes-headings' now reads a level 0 heading in +addition to numbers 1--8. Heading 0 accepts the same list of properties +as all other levels (please consult the doc string of the user option or +the corresponding entry in the manual). Currently only the value of the +Org #+title is affected (face is 'org-document-title'), but we may cover +more faces if needed. + +Sample configuration: + + ;; The `modus-themes-headings' is an alist with lots of possible + ;; combinations, including per-heading-level tweaks: read the + ;; manual or its doc string. + (setq modus-themes-headings + '((0 . (variable-pitch light (height 2.2))) + (1 . (rainbow variable-pitch light (height 1.6))) + (2 . (rainbow variable-pitch light (height 1.4))) + (3 . (rainbow variable-pitch regular (height 1.3))) + (4 . (rainbow regular (height 1.2))) + (5 . (rainbow (height 1.1))) + (t . (variable-pitch extrabold))) + +Given this change, I am also tweaking the default foreground value of +the 'org-document-title'. It is a bit more saturated than before, but +remains close to the spirit of the previous one. + +Thanks to Rudolf Adamkovič for proposing the idea on the mailing list: +<https://lists.sr.ht/~protesilaos/modus-themes/%3Cm2y1x5tewl.fsf@me.com%3E>. + + +Stylistic tweak to the user option 'modus-themes-syntax' +======================================================== + +Prevented the 'alt-syntax' property from desaturating the effect of the +'yellow-comments' property when the two would be combined. Such as: + + (setq modus-themes-syntax '(alt-syntax yellow-comments)) + +The previous design was incorrect because it was always using the faint +variant of the yellow comments, as if the user had specified: + + (setq modus-themes-syntax '(alt-syntax faint yellow-comments)) + +[ Read the doc string of 'modus-themes-syntax' or the manual for an + explanation of all properties and their combinations. ] + + +Review of the Isearch (and related) colours +=========================================== + +Emacs' standard search has a face for the currently matched query and +all its inactive matches. The faces are 'isearch' and 'lazy-highlight', +respectively. Before, we were using a green background by default for +the 'isearch' face and a cyan background for the 'lazy-highlight'. This +was a choice that was made in the early days of the project when the +palette was not yet fully realised. + +Green and cyan do not always contrast well side-by-side (subject to +hardware capabilities and environmental lighting), so the 'isearch' face +also had an added bold weight. This was not my preference, but it was +necessary under the circumstances. The previous combinations were also +not ideal when the user option 'modus-themes-deuteranopia' was set to a +non-nil value: the blue background which was used instead of the green +one could be conflated with the subtle teal of the 'lazy-highlight' +under certain circumstances, such as poor colour reproduction at the +monitor level or in terminal emulators with limited colour support. + +The new colours (intense yellow for active matches and subtle cyan for +lazy ones) are complementary, meaning that they are naturally easy to +tell apart. + +[ Read "Colour theory and techniques used in the Modus themes": + <https://protesilaos.com/codelog/2022-04-21-modus-themes-colour-theory/> ] + +These specific hues are also well-suited for users with red-green colour +deficiency: yellow stays as-is, while the cyan colour becomes a bit more +grey though remains distinct. As such, we do not need to run the helper +function 'modus-themes--deuteran' to set the style based on the value of +'modus-themes-deuteranopia'. + +The new colours do not clash with the style of the relevant 'match' face +(used by 'M-x occur', 'M-x grep', and related), nor with the various +permutations of the 'region' face (subject to the user option +'modus-themes-region'). + +Finally, the bold weight has been removed from the 'isearch' face. It +was always a kludge. Also, it would make paragraphs rendered in the +'variable-pitch' face (or proportional fonts in general) jump around as +the user would move between the matches, because bold letters occupy +more space than their regular weight counterparts so they affect the +length of the line. This problem was reported by Augusto Stoffel on the +mailing list: <https://lists.sr.ht/~protesilaos/modus-themes/%3C87sfnbswe9.fsf@gmail.com%3E>. + + +Rewrote parts of the colour preview commands +============================================ + +The 'modus-themes-list-colors', 'modus-themes-list-colors-current' are +commands that produce a buffer which shows previews of every entry in +the palette. Their code has been simplified and they now produce a +warning when the display terminal has limited colour support. +Furthermore, they read any overrides as specified in the user options +'modus-themes-operandi-color-overrides', 'modus-themes-vivendi-color-overrides'. + + +The "summertime" re-spin of colour overrides +============================================ + +The manual now includes a complete hand-crafted example of a pair of +themes that override the default palette. This is done as a technology +demonstration. It is not considered an "official" extension of the +Modus themes and will never be part of the code base as it does not +conform with our lofty accessibility standards. However, I took great +care in picking the colour overrides in the hope that users will (i) +have a usable theme, should they opt for it, and (ii) they recognise the +potential of our colour-overriding feature. + +Screenshots and related information: +<https://protesilaos.com/codelog/2022-07-26-modus-themes-color-override-demo/>. + +Thanks to user “Summer Emacs” for (i) suggesting the name “summertime”, +(ii) testing variants of this in her setup, and (iii) sending me +feedback on possible tweaks and refinements. All errors are my own. + +The idea for this project came from an exchange where Summer discovered +an old theme of mine (from my pre-Emacs days) and asked if I had +anything like it for Emacs. Voilà! + +[ This information is shared with permission. ] + +As for whether I have more plans... "Perhaps!" ;) + + +Removed support for certain packages or face groups +=================================================== + +I periodically install and use the packages we support to see if they +have any updates we need to cover but also to confirm that they work. +Usually, the user does not learn about this work, as I don't need to +make any changes or will make some minor tweaks. When I think that the +package is not in a good shape, I remove it from the list of explicitly +supported packages, meaning that the modus-themes no longer cover the +faces it defines. The removal of any package is done on a case-by-case +basis. If you disagree with this decision, please inform me about and I +shall reconsider. + +,* centaur-tabs :: Those of you who have been reading these release notes + are aware of a bug in centaur-tabs which basically prevents us from + using the standard ':inherit' attribute to style the centaur-tabs + faces. I have sent a patch to fix it, but have received no response + since February: <https://github.com/ema2159/centaur-tabs/pull/179>. + To me, this gives the package the "unmaintained" status, though I am + happy to revert the change as soon as it gets the maintenance it + needs. + + Relevant reports (and I got many others in my private inbox): + + - <https://github.com/protesilaos/modus-themes/issues/30> + - <https://gitlab.com/protesilaos/modus-themes/-/issues/288> + - <https://github.com/protesilaos/modus-themes/issues/15> + +,* cursor-flash :: its default face should be visible enough. + +,* dynamic-ruler :: The package does not build on my Emacs 29. Also, its + default faces are usable even without our recolouring. + +,* emacs-dashboard :: Its default faces inherit from basic faces that we + already support. + +,* frog-menu :: I have not seen this package being used anywhere. I + suspect it is because it has not found a niche between transient, + hydra, and embark. + +,* mct :: A few months ago I announced that its development is + discontinued. Either use vertico or switch to what Emacs provides as + a built-in option: <https://protesilaos.com/codelog/2022-04-14-emacs-discontinue-mct/>. + +,* org-treescope :: The package points to a GitHub repo, which is + archived. The current source is on GitLab, but the package is not + updated accordingly. This makes me believe it is not actively + maintained and am thus removing it from the list. + +,* paradox :: When I tried paradox, it took over my C-c g binding which I + have for Magit. As an Emacs user, I consider this an unacceptable + transgression. Looking at paradox's git repo, the project is not + maintained. If things change, I am happy to reinstate support for it. + +,* vc-annotate (built-in) :: It has not been working properly for a long + time now. Colours are unset and are not re-applied when switching + between the 'modus-operandi' and 'modus-vivendi' themes. + + Furthermore, the way 'vc-annotate-color-map' intersects with + 'vc-annotate-background-mode' puts us in an awkward spot: when the + mode is non-nil, the mapped values are used as backgrounds WITHOUT + giving us the chance to make the appropriate adjustments to the + foreground (so we end up with inaccessible colour combinations). This + means that we must fix a problem which is not ours by overriding the + user option of the background altogether. A theme outright disabling + user options is bad form. + + Even documenting a user-level set of configurations will not suffice, + as the results are unreliable. I tried the code which I copy further + below to test annotation with/without background, plus the change in + values when switching between modus-operandi and modus-vivendi. + Again, colours are not updated properly (I know the buffer of 'M-x + vc-annotate' needs to be generated again), as 'modus-operandi' may + retain the values set by 'modus-vivendi' or vice-versa. + + Ultimately, I feel 'vc-annotate' needs to be refactored to use + ordinary faces in ordinary ways. Or, at least, not try to outsmart + the user/theme about the choice of colours. + + Thanks to Philip Kaludercic for starting the thread about the + 'vc-annotate-background-mode' which reminded me about this problem: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C875ylfxkgi.fsf@posteo.net%3E>. + + The code I alluded to: + + (setq vc-annotate-background-mode nil) + + (defun my-modus-themes-vc-annotate () + ;; Actual values are for demo purposes + (modus-themes-with-colors + (if vc-annotate-background-mode + (setq vc-annotate-background bg-alt + vc-annotate-color-map + `((20 . ,red-intense-bg) + (40 . ,red-subtle-bg) + (60 . ,red-refine-bg) + (80 . ,yellow-intense-bg) + (100 . ,yellow-subtle-bg) + (120 . ,yellow-refine-bg) + (140 . ,magenta-intense-bg) + (160 . ,magenta-subtle-bg) + (180 . ,magenta-refine-bg) + (200 . ,cyan-intense-bg) + (220 . ,cyan-subtle-bg) + (240 . ,cyan-refine-bg) + (260 . ,green-intense-bg) + (280 . ,green-subtle-bg) + (300 . ,green-refine-bg) + (320 . ,blue-intense-bg) + (340 . ,blue-subtle-bg) + (360 . ,blue-refine-bg))) + (setq vc-annotate-background 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)))))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-vc-annotate) + + +Revised supported faces or face groups +====================================== + +,* Enhanced the default background colour of the current date in the Org + agenda. This is a subtle change, all things considered, which makes + it easier to discern where the highlight is while it remains close to + the spirit of the previous design. The idea is to not add too much + saturation here, because the buffer is already "busy" with lots of + highlights. Thanks to Daniel Mendler for the feedback on the mailing + list: <https://lists.sr.ht/~protesilaos/modus-themes/%3C3d8b1096-a7db-1e08-fefe-d39bed4a7ea3@daniel-mendler.de%3E>. + +,* Restyled the 'M-x man' and 'M-x woman' faces to have a bit more + saturation. A while ago I desaturated the 'Man-overstrike' and + 'woman-bold' faces on the premise that the added bold weight would be + sufficient. However, the bold weight may sometimes not draw the + desired attention, such as at small point sizes or with certain font + configurations. As such, the added intensity in colour is necessary. + +,* Changed the Selectrum quick key faces ('selectrum-quick-keys-match' + and 'selectrum-quick-keys-highlight') to have the same style as Avy, + Vertico's own "quick keys", and related. For a technical analysis, + read "Modus themes: case study on Avy faces and colour combinations": + <https://protesilaos.com/codelog/2022-04-20-modus-themes-case-study-avy/>. + +,* Made internal adjustments so that 'M-x list-packages' inherits from + the standard 'success', 'warning', and 'error' faces instead of adding + its own face attributes. In practice, the user will notice a change + for new packages in the listing if 'modus-themes-deuteranopia' is + non-nil. + +,* Introduced the same inheritance rules as above for the 'syslog' + package (mutatis mutandis). + +,* Increased the saturation of the 'package-status-available' face, which + is shown in the 'M-x list-packages' buffer. The overall effect is + subtle, though sufficiently noticeable. + +,* Revised the faces of the 'deft' package to make it look consistent + with the rest of the theme's relevant interfaces (to the extent + possible as Deft uses a non-standard presentation). + +,* Aligned the 'speedbar-highlight-face' with the user option + 'modus-themes-intense-mouseovers'. + +,* Refined the 'highlight-thing' face (see package of the same name). + This makes it stand out more and it also aligns it with the standard + 'match' face, which is pertinent here. + +,* Amplified the saturation of the 'dired-git-info' face. Makes it + easier to differentiate the Git commit text from the Dired listing, + without drawing too much attention to itself. + +,* Adjusted the hue of the 'easy-jekyll-help-face' from teal to blue. + This makes it look more like the standard 'help-key-binding' face, + although 'easy-jekyll' does not align with upstream Emacs in this + regard. + +,* Intensified the background of 'rectangle-preview' to work even in + cases where a grey background is already on display. This face is + used for the 'string-rectangle' command (e.g. C-x SPC to draw a + rectangle and C-t to insert text in its stead---works as a simple + "multiple cursors" on a straight line). + + +Support for new faces or face groups +==================================== + +,* chart (built-in) +,* denote +,* edmacro-label (Emacs 29) +,* info+ +,* leerzeichen + +A comment on 'info+'. As is the case with PACKAGE+ packages from the +Emacs Wiki, info+ defines lots of faces that hardcode colour values +instead of inheriting from basic faces. It does so for no good reason +and the results will likely not look decent in any theme. Furthermore, +these faces colourise too much even when the colour values can be +appropriately combined (ceteris paribus), making the buffer harder to +read. + +The support I add for info+ is consistent with the design principles of +the modus-themes, one of which is to avoid exaggerations as those +indirectly affect legibility. As such, some of the changes I introduce +here outright remove colouration, while others align the various +constructs with the overall aesthetic of the themes. + +Note that, by default, info+ adds clickable buttons to glossary terms. +This produces awkward combinations such as by buttonising the "string" +component inside of what actually is a function's argument. So you +have, say, FORMAT-[STRING] where "[]" represents the button: the FORMAT +gets one face and the [STRING] another, even though they are part of a +single argument. To me this looks broken and is counter-productive, +though it is not up to the theme to decide how packages fontify the +various constructs. At any rate, button styles at the theme level are +controlled by the user option 'modus-themes-box-buttons'. + +Thanks to Jonas Collberg for the feedback in issue 33 over at the GitHub +mirror: <https://github.com/protesilaos/modus-themes/issues/33>. + + +Miscellaneous +============= + +,* Named the mailing list address as the =Maintainer:= of Denote. + Together with the other package headers, they help the user find our + primary sources and/or communication channels. This change conforms + with work being done upstream in package.el by Philip Kaludercic. I + was informed about it here: + <https://lists.sr.ht/~protesilaos/general-issues/%3C875ykl84yi.fsf%40posteo.net%3E>. + +,* Addressed byte compilation warnings in doc strings pertaining to the + use of literal quotes. Thanks to Matt Armstrong and Rudolf Adamkovič + for the feedback on the mailing list: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C87bktlvgyy.fsf@rfc20.org%3E>. + +,* Fixed the ':link' value in the declaration of the user options + 'modus-themes-operandi-color-overrides', 'modus-themes-vivendi-color-overrides'. + It once again directs to the correct heading in the manual. + +,* Documented all the aforementioned, where necessary. + +,* Mentioned my 'fontaine' and 'lin' packages in the relevant sections of + the manual. The former helps set fonts and switch between font + presents. The latter is a stylistic variant of hl-line (its + documentation explains its raison d'être). +#+end_src + +* 2.4.0 +:PROPERTIES: +:CUSTOM_ID: h:ee0dcce9-3481-4533-8ded-a9a1f5269a41 +:END: + +#+begin_src text +Modus themes version 2.4.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2022-06-01 + +This entry documents the changes made to the project since the +publication of version 2.3.0 on 2022-04-01. It spans more than 60 +commits to an already stable project. + +The 'modus-operandi' and 'modus-vivendi' themes are built into Emacs-28 +(next stable release) or later, and are available on GNU ELPA as well as +other archives. Emacs-28 ships version 1.6.0, while the current +'master' branch (i.e. Emacs-29) and, by extension, GNU ELPA include the +latest tagged release. The packaged version is available as +'modus-themes'. + +Read the manual inside Emacs by evaluating: + + (info "(modus-themes) Top") + +Or visit: <https://protesilaos.com/emacs/modus-themes>. + + +Migration to SourceHut +====================== + +The sources of the project are as follows: + +- Git repo on SourceHut: <https://git.sr.ht/~protesilaos/modus-themes> + - Mirrors: + - GitHub: <https://github.com/protesilaos/modus-themes> + - GitLab: <https://gitlab.com/protesilaos/modus-themes> +- Mailing list: <https://lists.sr.ht/~protesilaos/modus-themes> + +- Official manual: <https://protesilaos.com/emacs/modus-themes> +- Change log: <https://protesilaos.com/emacs/modus-themes-changelog> +- Colour palette: <https://protesilaos.com/emacs/modus-themes-colors> +- Sample pictures: <https://protesilaos.com/emacs/modus-themes-pictures> + +It is still possible to open issues on either of the mirrors and I will +handle them in a timely fashion, though I encourage you to at least try +the mailing list workflow---it is ordinary email (just remember to +"reply to all"). + +Further reading that is relevant to SourceHut: + +- Moving all my Emacs projects to SourceHut: + <https://protesilaos.com/codelog/2022-04-07-all-emacs-projects-sourcehut/> + +- Primer on formatting Git patches with Emacs (Magit): + <https://protesilaos.com/codelog/2022-04-09-simple-guide-git-patches-emacs/> + + +Problems with byte compilation on Emacs 29 +========================================== + +For some time between mid-April to mid-May, users of Emacs 29 could not +byte compile the Modus themes. This has now been fixed in emacs.git, +per bug#55414: <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=55414>. +Thanks to everyone involved (A-Z): Alan Mackenzie, Eli Zaretskii, Lars +Ingebrigtsen, Mattias Engdegård, Stefan Monnier. + + +Messages about invalid face attributes while using the centaur-tabs +=================================================================== + +I mentioned this issue in the previous change log as well: upstream does +not allow us to use indirection in faces (the ':inherit' attribute). +This is not our bug. It is standard behaviour for themes to use +inheritance. + +I have an open pull request on the matter (since 2022-02-24): +<https://github.com/ema2159/centaur-tabs/pull/179>. + +Relevant reports: + +- <https://github.com/protesilaos/modus-themes/issues/30> +- <https://gitlab.com/protesilaos/modus-themes/-/issues/288> +- <https://github.com/protesilaos/modus-themes/issues/15> + + +Support for new faces or face groups +==================================== + +Directly supported +------------------ + +These are packages whose faces we override to make them work with the +themes. + +- 'calibredb'. I have tried to limit the wanton use of colour in the + relevant buffers and also align the package with the overall style of + the themes. The currently selected line is affected by the user + option 'modus-themes-hl-line'. + + Thanks to Ivan Popovych for the feedback on the official mailing list: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C87zgkgroi7.fsf%40gmail.com%3E>. + + Ivan also introduced some new faces to 'calibredb', which I helped + test. See: <https://github.com/chenyanming/calibredb.el/pull/60>. + +- 'ein' (Emacs IPython Notebook). We support its code blocks with the + appropriate colouration, while avoiding exaggerations. Thanks to + Maxime Tréca for the feedback in issue 31 over at the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/31>. + +- 'tree-sitter'. My intent was to reduce the overall colouration + produced by the default 'tree-sitter' faces. These tweaks give us + good results, though there still are some cases where 'tree-sitter' + exaggerates the styles it uses, such as by combining types with + constants to produce ad-hoc (anonymous) faces. We cannot do anything + about anonymous faces at the theme level. As such, we may get an + additional bold weight (when 'modus-themes-bold-constructs' is + non-nil) when we would rather not have it and/or a different colour + than the one desired. + + Thanks to Przemysław Kryger for the feedback in issue 303 over at the + GitLab mirror: <https://gitlab.com/protesilaos/modus-themes/-/issues/303>. + + If you are involved in the 'tree-sitter' project, please eliminate all + anonymous faces and replace them with symbols (i.e. defface) that are + editable by the user/theme. You are welcome to contact me if you need + help/ideas. + +- 'vundo' + + +Indirectly supported +-------------------- + +These are packages that either (i) inherit from base faces we already +support, or (ii) use colours from the Modus themes' palette. A list of +them is available in the manual. + +- egerrit. an in-development package by Niklas Eklund which provides an + Emacs interface to Gerrit: <https://git.sr.ht/~niklaseklund/egerrit>. + + +Changes to supported face +========================= + +- Reworked the internal functions that handle the styling of diffs to + allow the user option 'modus-themes-deuteranopia' to combine with the + styles of the 'modus-themes-diffs' option. + + Before, when 'modus-themes-deuteranopia' was non-nil it would affect + diffs by forcibly applying the default style of 'modus-themes-diffs' + (fairly prominent background colours) with the primary difference of + replacing greens with blues. + + Now all combinations work as expected. For example: + + (setq modus-themes-deuteranopia t + modus-themes-diffs 'desaturated) ; nil, 'desaturated, 'bg-only + + Thanks to Kevin Le Gouguec for the feedback on the mailing list: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C878rqt4jhm.fsf@gmail.com%3E> + +- Conducted a major (and highly demanding) review of the colours used by + Avy in the interest of optimising the contrast between its constructs. + Read the analysis: <https://protesilaos.com/codelog/2022-04-20-modus-themes-case-study-avy/>. + + Thanks to Daniel Mendler and Damien Cassou for their feedback on the + mailing list: + + - <https://lists.sr.ht/~protesilaos/modus-themes/%3C83f18e2e-d726-0248-72f5-95e896cbcf4c%40daniel-mendler.de%3E> + - <https://lists.sr.ht/~protesilaos/modus-themes/%3C87czhgt5nm.fsf%40cassou.me%3E> + +- Updated the 'vertico-quick' faces to be consistent with Avy. + +- Made the 'line-number' face conform with the user option + 'modus-themes-mixed-fonts'. This means that if the user option is + non-nil, line numbers of 'display-line-numbers-mode' will use a + monospaced typeface at all times (inheriting the 'fixed-pitch' face, + as explained in the themes' manual). Otherwise they use whatever font + the 'default' face has. This makes it better when the user enables + 'variable-pitch-mode' but still wants spacing-sensitive constructs to + remain monospaced. + + Thanks to Christopher League for the feedback in issue 302 over at the + GitLab mirror: <https://gitlab.com/protesilaos/modus-themes/-/issues/302>. + +- Aligned the regexp construct faces with the meaning of the user option + 'modus-themes-bold-constructs'. They will use a bold weight only when + the user option is non-nil. This design is consistent with all other + aspects of syntax highlighting. These specific faces were + unconditionally bold due to a mistake of mine. + + Remember to check the manual on what "a bold weight" means, as we make + everything easy to customise (e.g. if you prefer a semibold weight): + <https://protesilaos.com/emacs/modus-themes#h:2793a224-2109-4f61-a106-721c57c01375>. + +- Removed the typographic emphasis from the 'file-name-shadow' face by + no longer inheriting the 'italic' face. Thanks to Nicolas De Jaeghere + for the patch. + + [ Nicolas has assigned copyright to the Free Software Foundation. ] + +- Stopped using the 'inverse-video' face attribute in 'powerline'. We + now apply the colours directly. The reason is that 'inverse-video' + makes it tricky to override the face as it swaps the foreground with + the background. That behaviour is only needed in special cases: + 'powerline' is not one of them. + + Thanks to Thibaut Verron for the feedback in issue 305 over at the + GitLab mirror: <https://gitlab.com/protesilaos/modus-themes/-/issues/305>. + +- Ensured that git commit/rebase comments (as seen in the workflow of + the 'magit' package) inherit from appropriate font-lock faces. This + makes it possible to customise 'font-lock-comment-face' and have the + changes apply to those elements as well. Such a customisation can, + for example, involve the change of the font family or the addition of + a background colour. We want the whole comment block, including those + special keywords from Git, to look consistent. This change also makes + git-{commit,rebase}-comment-heading attain the foreground colour of + comments, instead of the default one (black or white), making it look + part of the comment block. + +- Tweaked the 'fountain' package comments to be the same as all others. + This avoids inconsistencies, such as when the user opts for something + like the following: + + (setq modus-themes-syntax '(yellow-comments)) + +- Disabled padding in the 'keycast' package, meaning that the box around + the key indicator always has the same height, even if the user opts + for a padding value in 'modus-themes-mode-line' (read the manual or + its doc string for how to assign a padding). + + This is in response to a change upstream that introduces the + 'keycast-tab-bar-mode', which re-uses the faces that were originally + intended for the mode line in the tab-bar. Ideally, upstream will + provide distinct faces for each context so that we can have padding in + the mode line but not the tab-bar. However, I have not had the + opportunity to suggest such a change and/or prepare the relevant patch + (it is not straightforward). + +- Refined some colour combinations for the "alternative syntax" style + that is available when the user option 'modus-themes-syntax' includes + the 'alt-syntax' property. These tweaks pertain to changes in hue + that improve the appearance of certain faces in their context. + +- Enabled conditional use of 'fixed-pitch' for key bindings. This + happens when the user option 'modus-themes-mixed-fonts' is non-nil + (all spacing-sensitive elements become monospaced even if the user + opts for a default font that is proportionately spaced or activates + the 'variable-pitch-mode'). Thanks to Manuel Giraud for the patch. + + [ Manuel has assigned copyright to the Free Software Foundation. ] + +- Covered the face rotation option of 'highlight-changes-mode'. It is + done with the 'highlight-changes-rotate-faces' command when + 'highlight-changes-mode' is enabled (the mode is built into Emacs). + + Thanks to Philip Kaludercic for the feedback on the mailing list: + https://lists.sr.ht/~protesilaos/modus-themes/<878rs14il4.fsf@posteo.net> + + +Updates to the manual +===================== + +- Acknowledged Andrew Tropin as one of the contributors to the Guix + package of the Modus themes. The latest patch to that end: + <https://issues.guix.gnu.org/55268>. + +- Rewrote the note on 'fill-column-indicator' to show how the user can + use a thicker line than the one we style by default. + +- Wrote a note in manual about 'php-mode' multiline comments which use + the 'font-lock-doc-face' instead of 'font-lock-comment-face'. Sample + code is provided to ensure consistency between all types of comments. + +- Added note about custom 'hl-todo' colours, specifically the user + option 'hl-todo-keyword-faces' (which the themes customise as an + exception to the rule, otherwise the default colours would not always + be accessible). + + This is in relation to the mailing list thread on the matter with + feedback from Vincent Foley and Christian Tietze: + <https://lists.sr.ht/~protesilaos/modus-themes/%3C871qwh1r88.fsf%40era.co%3E>. + +- Elaborated on the style of 'git-gutter' faces in Doom Emacs, which are + not as the Modus themes intend. Basically, the problem is that Doom + changes the way that package draws its bitmaps: the faces we configure + no longer appear as intended and sensitive colouration is lost. + + Thanks to Gonçalo Marrafa for reporting the issue, testing the code we + recommend on Doom Emacs, and suggesting the inclusion of the reference + to the 'after!' call (a macro that Doom defines). + + +Miscellaneous +============= + +- Dedicated the colours of the Modus themes---just the colours---to the + public domain. The Emacs package as a whole is still distributed + under the terms of the GNU General Public License. The announcement: + <https://protesilaos.com/codelog/2022-05-10-modus-themes-palette-cc0/> + +- Stopped using a timestamp in the modus-themes.el file. It could lead + to situations where there was a mismatch between the latest change and + the recorded time. It also introduced a barrier to entry for + contributors, as they need to set up 'time-stamp.el'. + +- Removed the unnecessary 'require' call to the 'seq' library and made + the necessary changes. Thanks to Daniel Mendler for the patch. + + [ Daniel has assigned copyright to the Free Software Foundation. ] + +- Applied the correct order of inheritance for all markup faces. This + fixes a problem where not all typographic attributes where applied to + the faces when 'modus-themes-mixed-fonts' was non-nil and the value of + 'modus-themes-markup' included '(bold italic)'. + +- Tweaked how 'org-date' conditionally uses 'fixed-pitch'. Basically, + we remove an internal stylistic inconsistency. There is no + user-facing change. Thanks to Manuel Giraud for the patch. + +- Implemented the command 'modus-themes-report-bug'. It might help + users find the email address of the mailing list and get started with + the email-centric workflow of SourceHut. Note this is but a first + step in that direction. If you think it can be improved, please + report as much (or send a patch). + +- Included the command 'modus-themes-version', which prints in the echo + area the current version of the package. With an optional prefix + argument, it inserts the string at point. + + The version either is the last tagged release, such as '2.4.0', or an + in-development version like '2.5.0-dev'. As we use semantic + versioning, tags of the '2.4.1' sort are not considered: those would + count as part of '2.5.0-dev'. +#+end_src + +* 2.3.0 +:PROPERTIES: +:CUSTOM_ID: h:f95fb7e2-fcc8-43f6-bde5-27fe51b1bdd5 +:END: + +#+begin_src text +Modus themes version 2.3.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2022-04-01 + +This entry documents the changes made to the project since the +publication of version 2.2.0 on 2022-02-23. It spans more than 70 +commits. + +To access the URL of the manual visit: +<https://protesilaos.com/emacs/modus-themes>. Or read it in the Emacs +Info reader by evaluating: + + (info "(modus-themes) Top") + +The 'modus-operandi' and 'modus-vivendi' themes are built into Emacs-28 +(next stable release) or later, and are available on GNU ELPA as well as +other archives. Emacs-28 ships version 1.6.0, while the current +'master' branch (i.e. Emacs-29) and, by extension, GNU ELPA include the +latest tagged release. + + +Customisation options +===================== + +,* The 'modus-themes-completions' now accepts a 'text-also' property for + the 'selection' key. This has the effect of colourising the current + line's text. Whereas the default does not change the text colour, + re-using whatever underlying colours are available. Consult the doc + string of this user option, as it provides for fine-grained control of + how completion UIs may look. Thanks to Morgan Willcock whose feedback + in issue 278 inspired me to add the 'text-also' property: + <https://gitlab.com/protesilaos/modus-themes/-/issues/278>. + +,* The 'modus-themes-box-buttons' now accepts an 'all-buttons' property. + It applies whatever other style is used for the boxed buttons to the + generic 'widget.el'. By default, the faces of 'widget.el' do not look + like graphical buttons: they have a bold weight and a foreground + colour instead. Examples where those are used are the Notmuch "hello" + buffer and the main view of the 'elfeed-summary' package. Thanks to + Daniel Mendler, Rudolf Adamkovič, and Tony Zorman for their feedback + in issue 296: <https://gitlab.com/protesilaos/modus-themes/-/issues/296>. + +,* The 'modus-themes-intense-mouseovers' is a boolean user option which + makes mouse hover effects more intense when set to a non-nil value. + By default, mouseovers use a cyan background value. This changes it + to a more prominent blue. Thanks to John Haman for the feedback in + issue 290: <https://gitlab.com/protesilaos/modus-themes/-/issues/290>. + +,* The user options 'modus-themes-box-buttons', 'modus-themes-mode-line', + 'modus-themes-org-agenda', and 'modus-themes-headings' can now read a + number value as a cons cell. The old method of a plain number + continues to work. This makes it possible to be more descriptive on + what a given value signifies. Each doc string describes the + technicalities. Here are samples that yield identical results: + + (setq modus-themes-mode-line '(accented 0.9 borderless 2)) + (setq modus-themes-mode-line '(accented (heigh 0.9) borderless (padding 2))) + + Thanks to Daniel Mendler for proposing this idea in issue 282: + <https://gitlab.com/protesilaos/modus-themes/-/issues/282#note_842257619> + + +Attempted bug fix for byte compiled files +========================================= + +Quoting from the git log: + + commit f067d2ef39c22174b95584f2cba7942aaf03bcca + Author: Protesilaos Stavrou <info@protesilaos.com> + Date: Thu Mar 3 06:52:31 2022 +0200 + + Reify themes with eval-and-compile + + This is an attempt to fix a bug that has existed since version 1.2.0 of + the themes or even earlier. + + The bug is about a mismatch between compiled code and runtime + dependencies. The runtime expects the current version while the + compiled code only furnishes an outdated one, thus resulting in an + error. This only happens when: + + 1. Private functions change to accept more/fewer arguments. + 2. Variables change their acceptable value (e.g. from symbol to list). + 3. The user is installing the package via the package.el mechanism which + takes care of byte compilation (though anything that mimics + package.el should exhibit the same behaviour). + + My understanding is that the cause was the limited scope of the + 'eval-and-compile' we had before: it would run the 'require' also at + compile time, whereas the 'modus-themes-theme' macro, which reifies the + actual theme, would only be evaluated at runtime. Hence the mismatch as + 'require' would read the already installed byte code while the macro + would expect newer forms. + + Wrapping everything in the 'eval-and-compile' should address this + problem. Hopefully it will not engender new ones... + + ,* * * + + The latest reports about this bug: + + ,* GitLab issue 287 with Mark Bestley and Daniel Mendler: + <https://gitlab.com/protesilaos/modus-themes/-/issues/287>. + + ,* GitHub issue 22 with Rytis Paškauskas: + <https://github.com/protesilaos/modus-themes/issues/22>. + + doc/modus-themes.info | 30 +++++++++++++++--------------- + doc/modus-themes.org | 15 ++++++++------- + modus-operandi-theme.el | 10 +++++----- + modus-vivendi-theme.el | 10 +++++----- + 4 files changed, 33 insertions(+), 32 deletions(-) + +After nearly one month, no problem has been observed as a result of this +change. + + +Newly supported packages +======================== + +These are added to the already comprehensive coverage we guarantee. + +Directly supported: + +,* devdocs. Thanks to Augusto Stoffel, its developer, for the feedback + which was sent via email. + +,* mini-modeline. Thanks to Julio C. Villasante for the feedback in + issue 24 over at the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/24>. + +Indirectly supported (they use faces that we already cover): + +,* elfeed-summary +,* undo-hl + + +Changes to supported faces or packages +====================================== + +,* Improved the colours used by 'avy' to always guarantee constrast in + hueness between side-by-side characters with a variety of user + settings. I tried various styles, such as: + + (setq avy-style 'pre) + (setq avy-style 'at-full) + + For the sake of completeness, I also ran tests by modifying the + 'avy-lead-faces' (which is a 'defconst', not a 'defcustom'): + + (setq avy-lead-faces + '(avy-lead-face + avy-lead-face-0 + avy-lead-face-2 + avy-lead-face + avy-lead-face-0 + avy-lead-face-2)) + + (setq avy-lead-faces + '(avy-lead-face + avy-lead-face-1 + avy-lead-face-1 + avy-lead-face-1 + avy-lead-face-1)) + + (setq avy-lead-faces + '(avy-lead-face + avy-lead-face-2 + avy-lead-face-2 + avy-lead-face-2 + avy-lead-face-2)) + +,* Updated the 'vertico-quick' faces to keep them aligned with the new + Avy styles. Thanks to Daniel Mendler (Vertico's developer) for the + reminder: + <https://gitlab.com/protesilaos/modus-themes/-/commit/404a9658196debdde95a51148fc62c5b2faccfb9#note_856454659>. + +,* Applied warmer though still not saturated colours for Org clocking + overlays. The previous style could be mistaken for a mouse highlight + or the highlighted line if 'modus-themes-hl-line' included the + properties 'intense' and 'accented'. Thanks to Rudolf Adamkovič for + the feedback in issue 293: + <https://gitlab.com/protesilaos/modus-themes/-/issues/293>. + +,* Broadened coverage of the built-in 'shr.el' library to include the new + 'shr-code' face (Emacs 29). + +,* Expanded support for the 'embark' package by covering its new + 'embark-collect-marked' face. Thanks to Daniel Mendler for the + feedback in issue 299: + <https://gitlab.com/protesilaos/modus-themes/-/issues/299>. + +,* Made the 'fill-column-indicator' a contiguous line. It was a dashed + line before, per the Emacs defaults, which led to awkward results + depending on the font family and value of 'line-spacing'. Thanks to + Daniel Mendler for the feedback in issue 297: + <https://gitlab.com/protesilaos/modus-themes/-/issues/297>. + +,* Added explicit support for the built-in 'separator-line' face in order + to refine its presentation. This is present in 'M-x shortdoc' buffers + (Emacs 28). Thanks to Daniel Mendler for the feedback in issue 297: + <https://gitlab.com/protesilaos/modus-themes/-/issues/297>. + +,* Applied explicit styling to the generic 'underline' face in order to + ensure its consistent colouration. The problem before was that an + underline that spanned text with distinct colours would inherit the + colour of the affected character. A uniform presentation makes + everything easier to read. + +,* The 'ement.el' Matrix client now uses a subtle background for username + mentions and/or quoted text. This is consistent with how other Matrix + clients style such constructs. Thanks to Adam Porter (aka + "alphapapa"), the developer of ement.el, for explaining the + technicalities and providing the relevant feedback in issue 25 over at + the GitHub mirror: <https://github.com/protesilaos/modus-themes/issues/25>. + +,* Enforced consistency between 'icomplete' and 'ido'. The first match + was coloured differently in 'ido-mode' by mistake. Thanks to Morgan + Willcock for the feedback in issue 278: + <https://gitlab.com/protesilaos/modus-themes/-/issues/278>. + +,* Used the main foreground for Company's tooltip. This is how it should + have been. Corfu is designed that way as well. Thanks to user okamsn + for the feedback in issue 278: + <https://gitlab.com/protesilaos/modus-themes/-/issues/278>. + +,* Corrected an omission whereby the AUCTeX verbatim face was not + consistent with other such faces. Now it too is governed by the user + option 'modus-themes-markup'. + +,* Fixed the 'centaur-tabs' invalid background message. Thanks to + Lennart C. Karssen for reporting the bug in issue 288: + <https://gitlab.com/protesilaos/modus-themes/-/issues/288>. Note, + however, that the problem is due to some decisions made upstream. My + patch has not been merged yet (open since 2022-02-24): + <https://github.com/ema2159/centaur-tabs/pull/179>. Given this + opportunity, always anticipate that faces may ':inherit' from others + and thus functions like 'face-background' might return an undesirable + nil value if used without a fallback. + + +Miscellaneous +============= + +,* Made the 'modus-themes--current-theme' return the first Modus theme + instead of the 'car' of 'custom-enabled-themes'. This makes the + themes work at all times even when the user has multiple of them + enabled. Thanks to Pierre Téchoueyres for the patch, which was sent + via email with regard to Emacs bug#54598: + <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=54598>. + +,* Implemented compile-time requirement for built-in libraries to be sure + that the themes work in all cases. Thanks to Antonio Hernández Blas + for reporting in issue 292 the bug with the old design that assumed + the 'cl-lib' and 'subr-x' as already loaded: + <https://gitlab.com/protesilaos/modus-themes/-/issues/292>. + +,* Wrote in the manual how to achieve a monochrome style (with + permutations) for code syntax highlighting. Thanks to Augusto Stoffel + for sharing the idea via an email exchange (this information is + divulged with permission). + +,* Clarified some statements in the manual's section about the nuances in + "enabling" and "loading" a theme. + +,* Documented how the applicable palette affects the outer boundaries of + the colour range that terminal emulators set when Emacs is ran without + a GUI. Here "the palette" refers to the relevant 16 ANSI escape + sequences (terminal colours 0 through 15). For the sake of + convenience, the node includes ready-to-use palettes for XTerm, which + can be adapted to other terminal emulators. This entry complements an + existing one on improving the colour accuracy in terminal emulators. + +,* Used American English constructions in a few places such as "color" + instead of "colour" as that is what core Emacs expects (and the themes + are part of emacs.git). + +,* Updated the description of the themes to be more user-friendly. + Instead of "Highly accessible themes (WCAG AAA)" we now have "Elegant, + highly legible and customizable themes". Nothing changes in terms of + substance. Thanks to Jorge Morais for the feedback. + +,* Clarified that the version of the themes which is built into Emacs + does not use 'require'. It is in response to this thread: + <https://lists.gnu.org/archive/html/help-gnu-emacs/2022-03/msg00049.html>. + Thanks to Philip Kaludercic for bringing the issue to my attention. + +,* Improved the code samples that show how to set up the package. + +,* Wrote the correct symbols for some obsoletion forms. + +Thanks once again to everyone involved! +#+end_src + +* 2.2.0 +:PROPERTIES: +:CUSTOM_ID: h:251849ee-3328-48c7-af5f-d1d6daca3a97 +:END: + +#+begin_src text +Modus themes version 2.2.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2022-02-23 + +The present entry records the changes made to the project since the +publication of version 2.1.0 on 2022-02-17. This spans about 10 commits +(though one of them is massive). Normally the release cycle occurs over +periods of 4-5 weeks. This is a necessary exception. + +To access the URL of the manual visit this web page: +<https://protesilaos.com/emacs/modus-themes>. Or read it in the Emacs +Info reader by evaluating this form: + + (info "(modus-themes) Top") + +The 'modus-operandi' and 'modus-vivendi' themes are built into Emacs-28 +(next stable release) or later, and are available on GNU ELPA as well as +other archives. Emacs-28 ships version 1.6.0, while the current +'master' branch (i.e. Emacs-29) and, by extension, GNU ELPA include the +latest tagged release. + + +Initialisation of user options +============================== + +Removed a superfluous default value that hampered the initialisation of +defcustom forms in the M-x customize interface. Things would still +work, but the interface was not looking right while editing the relevant +variables. Thanks to Gustavo Barros for reporting the bug in issue 267: +<https://gitlab.com/protesilaos/modus-themes/-/issues/267>. + + +Refactor 'modus-themes-completions' +=================================== + +Implemented thoroughgoing reforms across all completion User Interfaces +(UIs) in order to make them more flexible/powerful and harmonise their +looks. + +'modus-themes-completions' now accepts an alist instead of a symbol. +Each cons cell is in the form of '(key . list-of-properties)'. The doc +string describes all the details. + +In terms of out-of-the-box appearences, all completion UIs have a subtle +aesthetic. This was always the case for the likes of Vertico, Icomplete +(Fido), and related, though it constitutes a marked departure from what +Ivy and Helm used to look like. Users of the latter two can still get +the more colourful or intense style with something like this: + + (setq modus-themes-completions '((matches . (background intense)) + (selection . (accented intense)) + (popup . (accented intense)))) + +Or simply: + + (setq modus-themes-completions '((t background intense accented))) + +The documentation explains all those associations in-depth. There also +are other styles on offer (and combinations thereof). + +Furthermore, the new 'modus-themes-completions' encompasses more UIs +than its predecessor, including Company and Corfu. + +In the interest of theme-wide consistency, all applicable faces have +been reviewed. + +Finally, note that the previous tagged release also made changes on this +front, but it did not disrupt the status quo that was in place from +before the release of version 1.0.0 of the themes (more than a year +ago). In other words, it tried to make unnecessary compromises within +the confines of an outdated design that did not fit in with the rest of +the code base. The new 'modus-themes-completions' might require manual +intervention from users who want to customise things to their liking, +though I feel this change is to our long-term benefit. + +Thanks to Daniel Mendler and Rudolf Adamkovič for their feedback in +issue 278: <https://gitlab.com/protesilaos/modus-themes/-/issues/278>. +And thanks to Kenta Usami for recommending the use of a warning in issue +286: <https://gitlab.com/protesilaos/modus-themes/-/issues/286>. + + +Miscellaneous changes +===================== + ++ Removed the pseudo-button effect from the 'org-checkbox' face. It was + not up-to-date with the current style of the rest of the themes, + including the Org constructs for source block delimiters, the TODO + keywords, the priority cookies (e.g. '[#A]'), and others. + ++ Introduced a section in the manual which provides an alternative to + the standard 'modus-themes-toggle' that leverages 'enable-theme' + instead of 'load-theme' under the hood. These technicalities are all + explained in the manual. + ++ Provided an alternative greyscale palette subset for 'modus-operandi' + in the manual's section about overriding colours. + ++ Added support for the built-in 'custom-variable-obsolete' face. + ++ Fixed typo in the 'modus-themes-box-buttons' variable. Thanks to + Illia Ostapyshyn for the patch in merge request 58: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/58>. +#+end_src + +* 2.1.0 +:PROPERTIES: +:CUSTOM_ID: h:15098250-7b41-404b-86e1-9a99984976b9 +:END: + +#+begin_src text +Modus themes version 2.1.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2022-02-17 + +The present entry records the changes made to the project since the +publication of version 2.0.0 on 2021-12-24. There have been more than +110 commits in the meantime (and this log is close to 5000 words). + +All modifications of colour combinations mentioned herein are made in +accordance with the primary accessibility objective of the themes for a +minimum contrast ratio of 7:1 between background and foreground values +in their given combination (the WCAG AAA standard for relative colour +luminance). Edits also account for colour-coding that is optimised for +the needs of users with red-green colour deficiency (deuteranopia). + +To access the URL of the manual visit this web page: +<https://protesilaos.com/emacs/modus-themes>. Or read it in the Emacs +Info reader by evaluating this form: + + (info "(modus-themes) Top") + +The 'modus-operandi' and 'modus-vivendi' themes are built into Emacs-28 +(next stable release) or later, and are available on GNU ELPA as well as +other archives. Emacs-28 ships version 1.6.0, while the current +'master' branch (i.e. Emacs-29) and, by extension, GNU ELPA include the +latest tagged release. + + +Commands +======== + +The following produce a buffer that previews the colour palette of the +given theme ('modus-operandi' or 'modus-vivendi'). + +,* 'modus-themes-list-colors' prompts for a theme before producing the + preview. + +,* 'modus-themes-list-colors-current' uses the current Modus theme. + +These commands are useful to anyone who wants to reference a named +colour from the themes or copy a colour value, such as for the purposes +of user-level customisation (as documented at length in the manual +across several use-cases and with the inclusion of custom code). + +The commands are not bound to any key. + + +Customisation options +===================== + +,* Implemented the 'modus-themes-markup' variable, which supersedes the + now-deprecated 'modus-themes-intense-markup'. The new user option + accepts a list of properties (symbols). It affects constructs such as + Org's =verbatim=, ~code~, and macro (with three pairs of braces). By + default, when this user option is either nil or an empty list, the + affected constructs only have a foreground colour (e.g. Org verbatim + is magenta). Properties that change this style are: + + 1. 'italic' for an added slant to the text. + 2. 'bold' for a heavier weight. + 3. 'background' to add a background colour. + 4. 'intense' to amplify the colouration (especially of 'background'). + + As with all user options which accept a list of properties, the order + of the symbols is no significant. In user configurations it may look + like this: + + (setq modus-themes-markup '(background intense bold)) + + [ Read the manual for bold and italic fonts. We do not hardcode a + :weight or :slant, instead giving the user the option to set their + own values. The defaults are what you would normally expect from + "bold" and "italic". ] + + Thanks to Rudolf Adamkovič for reporting some problems with the old + design in issue 274: + <https://gitlab.com/protesilaos/modus-themes/-/issues/274>. + +,* Added the 'modus-themes-box-buttons' which affects all pseudo + graphical buttons, such as those found in Custom UI buffers or EWW web + pages which include search forms and the like. The variable accepts a + list of properties as its value. By default (nil or empty list), + buttons have a grey background and the familiar 3D effect. Valid + properties are: + + 1. 'flat' to remove the 3D effect. + 2. 'accented' to shift the colouration away from grey. + 3. 'faint' to reduce the overall colouration (e.g. grey becomes white). + 4. 'variable-pitch' to apply a proportionately spaced font. + 5. 'underline' to draw a line instead of applying a 3D or flat box + (particularly useful for those who use Emacs in a terminal emulator). + 6. The symbol of a font weight, such as 'bold', 'semibold', 'light' or + any one among those included in the 'modus-themes-weights' constant + (the underlying font family has to support the given weight). + 7. A number, expressed as a floating point (e.g. 0.9), which adjusts + the height of the button’s text to that many times the base font + size. The default height is the same as 1.0, though it need not be + explicitly stated. + + The order in which those symbols appear in the list is not + significant. If 'underline' and 'flat' are both specified, the former + takes precedence. In user init files the form may look like this: + + (setq modus-themes-box-buttons '(variable-pitch flat semilight 0.9)) + + Thanks to Daniel Mendler for suggesting this user option and providing + the relevant feedback in issue 282: + <https://gitlab.com/protesilaos/modus-themes/-/issues/282>. + +,* Expanded the 'modus-themes-mail-citations' with an 'intense' variant. + For example: + + (setq modus-themes-mail-citations 'intense) + + The default is a moderately coloured style. Other variants include + 'faint' for subtle colouration and 'monochrome' for an all-grey look. + +,* Reviewed the 'modus-themes-completion' option and harmonised all the + face specifications it governs. The variable now accepts a fourth + stylistic variant in 'super-opinionated': it is like the 'opinionated' + one though some details are even more pronounced. Other noteworthy + items: + + [ Remember to read the doc string of 'modus-themes-completions', which + explains the grouping of the completion UIs. ] + + - The (setq modus-themes-completions 'moderate) style is more-or-less + the same across all completion UIs. The highlight applied to the + current line is a bespoke shade of blue, the characters are less + saturated than before and their hues are different, though the + overall effect should still feel "sufficiently colourful, but not + overdone". + + - The (setq modus-themes-completions nil) is the same as before. + However: + + - The current line in Ivy now uses a shade of blue that is + specific to completion UIs instead of an intense cyan + background. This is for theme-wide consistency. + + - Helm's current line has the same bespoke blue for its current + line instead of another shade of blue it was using before. + + - The (setq modus-themes-completions 'opinionated) should be the same + as before, notwithstanding the aforementioned tweaks to Ivy/Helm. + + - The (setq modus-themes-completions 'super-opinionated) for + Icomplete, Vertico, Selectrum, Mct uses the same blue for the + current line as is the default of Ivy and Helm. + + Miscellaneous: + + - The relevant private helper functions were rewritten. + + - We declare a few faces to help streamline certain styles. + + - Ivy action keys now inherit from 'modus-themes-key-binding'. We + generally try to make all keys look the same, except when that would + be detrimental to the usability of the given context/interface. + + - Some Ivy faces are simplified or otherwise tweaked to fit in with + the rest of the theme. + + Thanks to Rudolf Adamkovič for the feedback about Vertico in issues + 214 and 278 which prompted me to review all completion UIs: + + - <https://gitlab.com/protesilaos/modus-themes/-/issues/214> + - <https://gitlab.com/protesilaos/modus-themes/-/issues/278> + +,* Adjusted the applicable hues in some 'modus-themes-syntax' variants. In + particular: + + - The strings' hue has more hints of blue when 'modus-themes-syntax' + includes the 'green-strings' property. Such as: + + (setq modus-themes-syntax '(green-strings)) + (setq modus-themes-syntax '(alt-syntax green-strings)) + (setq modus-themes-syntax '(alt-syntax green-strings faint)) + (setq modus-themes-syntax '(alt-syntax green-strings faint yellow-comments)) + + - Strings are more orange/yellow than red when 'modus-themes-syntax' + includes the 'alt-syntax' property but NOT the 'green-strings'. For + example: + + (setq modus-themes-syntax '(alt-syntax)) + (setq modus-themes-syntax '(alt-syntax yellow-comments)) + (setq modus-themes-syntax '(alt-syntax yellow-comments faint)) + + - Backslashes for regexp constructs are coloured appropriately to look + distinct from the rest of the string and from the escaped construct in + all cases. + +,* Removed background colours from the the default style of Org block + delimiters. + + As I explained in Emacs bug#52587,[1] Org has code that overrides + themes which prefer not to extend the block delimiter faces to the + edge of the window (as we would like to do by default). This + practically means that we cannot have backgrounds for those lines and + keep them limited to the stretch of area covered by their text. + + As such, the default for Org block delimiter lines now is a gray + foreground with no distinct background colour. The user option + 'modus-themes-org-blocks' provides "blocky" alternatives that use + background colours---those extend to the edge of the window. + + [1] <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=52587#46> + +,* Deleted the compatibility layer for all user options that used to + accept symbols in the past but now expect a list of symbols. The + manual contains a snippet with all customisation options for those who + do not want to read all the relevant doc strings. Evaluate this: + + (info "(modus-themes) Customization Options") + + Or visit: <https://protesilaos.com/emacs/modus-themes#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f>. + + The original plan was to remove those during the transition to version + 2.0.0 (about a month ago) though I changed my mind thinking they would + not pose a longer-term problem. + + New information by Mark Bestley in issue 272 shows that this kind of + complexity can lead to errors: + <https://gitlab.com/protesilaos/modus-themes/-/issues/272#note_826725412>. + + So it is better to keep things simple and ask users to configure all + user options based on the up-to-date documentation. + + Also thanks to Saša Janiška for the feedback in issue 272. + + +New packages, faces, or face groups +=================================== + +,* all-the-icons-dired. + +,* all-the-icons-ibuffer. + +,* 'child-frame-border' face (Emacs 28). + +,* 'citar' package. Thanks to Rudolf Adamkovič for the feedback in issue + 280: <https://gitlab.com/protesilaos/modus-themes/-/issues/280>. + +,* 'elisp-shorthand-font-lock-face' (Emacs 29). Read the manual by + evaluating: + + (info "(elisp) Shorthands") + +,* 'ement' (ement.el) Matrix client, though it is not listed in any + archive yet: <https://github.com/alphapapa/ement.el>. + + Thanks to Samuel Culpepper for the feedback in issue 279: + <https://gitlab.com/protesilaos/modus-themes/-/issues/279>. + + Also check the Ement issue tracker on the matter: + <https://github.com/alphapapa/ement.el/issues/53>. + +,* 'mct' package. + +,* 'menu' face (built-in) which is used in the menu-bar when Emacs runs + without a graphical toolkit. + +,* 'pgtk-im-0' face (Emacs 29). This is shown as a single-character-long + block when you type the Compose key followed by the composable + characters. + +,* 'pyim' (an input method for CJK characters). Thanks to Yuanchen Xie for + the contribution in merge request 57: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/57>. + The patch is small and is thus excluded from the requirement for + copyright assignment to the FSF (remember that the themes are built + into Emacs and any major contribution needs such copyright + assignment---read the relevant entry in the themes' manual). + +,* 'slime' and 'sly' packages. Thanks to John Haman for the feedback + which was done via email due to some problems with the web UI on + GitLab (this information is shared with permission). Please note that + I am not familiar with Common Lisp and could not test these + thoroughly. Any mistakes or omissions are my own. + + Concerning the web UI, there is a fully functional mirror of the + themes on GitHub, while email is always an option. Use whatever works + for you to report an issue or send a patch. + +,* 'textsec' package (Emacs 29). + +New indirectly supported packages +--------------------------------- + +These inherit from base faces and look good enough already or use +appropriate colours from the Modus themes: + +,* dtache +,* org-remark + + +Changes to supported faces or face groups +========================================= + +,* Stopped making key bindings look like boxes. We revert to the old + style we were using before the introduction of the 'help-key-binding' + face (Emacs 28). + + By default Emacs 28 or higher will render all key bindings it + identifies with a box around them. The idea is to make them look like + keys on a keyboard, which I never really liked because without + generous padding you get a very tight space between the character and + the box's borders which can look weird at small point sizes (Emacs + faces do not have padding in the same way CSS does). + + I tried following the default style for a few months and have concluded + that it is not good enough for our purposes (my preferences + notwithstanding): + + - The box attribute does not work in terminal emulators. This means + that keys only get a subtle grey background and the default + foreground, which can be hard to make them stand out from their + surrounding text if the font height is small and/or the keybinding is + short (e.g. a single character). + + - The box and grey background combination limits our options when we + need to colour-code different types of keys. For example, the + 'which-key' package can show TAB as T and applies to it a different + face to make the distinction obvious. In that case, the presence of + the tight box makes the use of a bold weight inappropriate: the + character and the box's borders seem to overlap. While the grey + background limits our choice of colour as, for instance, yellow + never looks good against it. Same principle for interfaces that can + have colour-coded keys like 'transient' and 'hydra', where we lose + much-needed flexibility. + +,* Adjusted the brightness of the 'which-key-special-key-face'. This is + the face that applies to special keys. For example: + + (setq which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL")) + +,* Made 'transient' faces which are supposed to be de-emphasise certain + elements inherit the 'shadow' face. This is an implicit customisation + option, as it allows the user to adjust the foreground value of all + "less important" constructs simply by changing the 'shadow' face. + +,* Covered the 'transient-purple' face (these are like the colour-coding + of 'hydra'). + +,* Tweaked the 'transient-argument' and 'transient-value' faces to make + things look a bit more consistent with the other transient faces. + This is to avoid potential conflicts with the highlighted key + bindings, especially when transient uses hydra-style colour-coded + keys. + +,* Applied the same metaphors for key bindings to 'marginalia-key' + ('marginalia' package) and 'embark-keybinding' ('embark' package). + They inherit the 'modus-themes-key-binding' when possible. The only + exception is with (setq modus-themes-completions nil) where conflicts + may arise between the key's style and matching characters of the + ongoing completion session. + + Thanks to Rudolf Adamkovič for pointing out the inconsistency in issue + 278: <https://gitlab.com/protesilaos/modus-themes/-/issues/278>. + +,* Refrained from treating LaTeX sections as headings. This is because + unlike Org/Outline/Markdown Latex is basically source code, so the + sectioning does not work the same way it does for those lightweight + markup/outlining modes. + + Furthermore, font-latex.el defines 'font-latex-fontify-sectioning' + which can be used to control the scale of those sections. It makes + sense for the themes to not interfere with that design and just allow + users to customise things uniformly regardless of the active theme. + + Thanks to Gustavo Barros for the detailed feedback in issue 265: + <https://gitlab.com/protesilaos/modus-themes/-/issues/265>. + +,* Reviewed the hues of 'all-the-icons' and related packages. + +,* Applied the correct style to 'info-menu-header', meaning that it now + only uses a bold weight as it is not a real heading, instead of being + affected by the user option 'modus-themes-headings'. + +,* Included new 'telega-entity-type-spoiler' face. Thanks to bit9tream + for informing me about it in issue 271: + <https://gitlab.com/protesilaos/modus-themes/-/issues/271>. The + conclusion: + + Tricky though perhaps dull + + I understand this is not an interesting topic and it probably is + too difficult to relate to the various data points without + visualising them and comparing the before and after + states. Furthermore, data can be deceptive and I have always + maintained that theme development stands at the intersection of + science and art (at least for the purposes of conforming with the + rigorous accessibility standards of the Modus themes). + + That granted, I wanted to shed light on the “behind the scenes” + work that is not immediately obvious when one checks a diff that + introduces some seemingly trivial tweaks like '#49d239'->'#49c029' + or '#7fcfff'->'#8fbfff'. + +,* Tweaked the hues of all graph colours, which are used in the + 'org-habit' table. The changes are subtle and should improve the + overall usability of the graph. For the technicalities, read: + <https://protesilaos.com/codelog/2022-01-02-review-modus-themes-org-habit-colours/>. + + Also thanks to Rudolf Adamkovič for reporting the problem with white + text on yellow background in issue 270: + <https://gitlab.com/protesilaos/modus-themes/-/issues/270>. + +,* Styled the 'markdown-highlighting-face'. This is the face used for + text in between double equals signs when the user option + 'markdown-enable-highlighting-syntax' is non-nil. + +,* Amplified the overall colouration of Eldoc's current argument. It is + a yellow foreground with a tinted background. The blue foreground + which was applied before could be hard to tell apart in some cases, + especially because it is a common colour that is used elsewhere in the + themes. Whereas the warmer hues are easier to discern, especially + while relying only on peripheral vision. + + Thanks to Rudolf Adamkovič for the feedback in issue 275: + <https://gitlab.com/protesilaos/modus-themes/-/issues/275>. + +,* Instructed Geiser to use the same style for its argument as Eldoc + (edited the faces 'geiser-font-lock-autodoc-current-arg' and + 'geiser-font-lock-autodoc-identifier'). + +,* Made the 'keycast-key' face work when 'modus-themes-mode-line' has a + padding value (read the latter doc string or consult the manual). + +,* Refined the 'magit' faces for bisect, reflog, sequence, and signature + views. They get a bold weight and, where appropriate, are made to + comply with the 'modus-theems-deueteranopia' option (meaning that + greens turn into blues). + +,* Recoloured 'elfeed' tags from a shade of cyan to magenta, in the + interest of theme-wide consistency but also to make them easier to + tell apart from the name of the feed. Also updated the faces used in + the header-line to look better in context. + +,* Removed the hardcoded ':slant italic' from the 'italic' face, which is + consistent with how we do not hardcode ':weight bold' in the 'bold' + face. + + Such a design allows users to configure those faces and have the + desired slant/weight (and even font family) apply consistently + throughout the theme. Read the manual for further details: + <https://protesilaos.com/emacs/modus-themes#h:2793a224-2109-4f61-a106-721c57c01375>. + + Thanks to user derek-upham for pointing out the inconsistency in issue + 21 over at the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/21>. + +,* Improved the styles that apply to compilation buffers and related. + The overarching intent was to reduce the excess colouration, without + upsetting expectations and affecting the overall presentation. + + Thanks to Rudolf Adamkovič for the feedback in issue 277: + <https://gitlab.com/protesilaos/modus-themes/-/issues/277>. + + Note that compilation buffers apply an underline by default. The + manual explains how to change that: + <https://protesilaos.com/emacs/modus-themes#h:420f5a33-c7a9-4112-9b04-eaf2cbad96bd>. + +,* Ensured a consistent style for the 'highlight' face across all + contexts (typically used for mouse hover effects). The mode line has + an exception when its style includes an accented background (per + 'modus-themes-mode-line'). + + Thanks to Rudolf Adamkovič for the feedback in issue 214: + <https://gitlab.com/protesilaos/modus-themes/-/issues/214>. + +,* Changed the foreground of 'mode-line-emphasis' from blue to purple, in + order to avoid potential (albeit unlikely) confusion with other + indicators. + +,* Desaturated the 'man' and 'woman' foreground value of the bold + constructs and tweaked other faces to avoid potential inconsistencies. + Thanks to Daniel Mendler for the feedback: + <https://gitlab.com/protesilaos/modus-themes/-/commit/8080eb1c6c0020ba82e8abaa933d6686327bc616#note_841424489>. + +,* Removed certain exaggerations from widgets as seen in the Custom UI + and EWW. Specifically: + + - 'widget-field' does not need to ':extend', as that typically does + not look good. + + - 'custom-state' gets a warmer colour to convey its message more + effectively. + + - 'eww-form-text' no longer uses a ':box' because that breaks when the + widget occupies more than one line. + + - 'eww-form-textarea' can now inherit from 'eww-form-text'. + + Thanks to Daniel Mendler for the feedback on the style of those faces in + issue 284: <https://gitlab.com/protesilaos/modus-themes/-/issues/284>. + + +The manual +========== + +,* Clarified the wording of 'shr' fonts, which affect 'eww', 'elfeed', + 'ement', and possibly others. + +,* Wrote section on custom Org emphasis faces. It includes code samples. + +,* Answered a Frequently Asked Question on whether the Modus themes are + "colour schemes"---they are not and it is important to understand why. + +,* Addressed another Frequently Asked Question about porting the themes + to other platforms or editors. Relevant blog posts which explain how + complex the issue is and why porting requires the same attention to + detail as this project: + + - <https://protesilaos.com/codelog/2022-01-03-modus-themes-port-faq/>. + - <https://protesilaos.com/codelog/2022-01-23-base16-modus-themes/>. + +,* Improved the sample code in the section about the backdrop of PDF + files while using 'pdf-tools'. Thanks to Utkarsh Singh for the patch, + which was sent via email. + +,* Provided sample code on an alternative style for Ediff. + + There was a discussion with Philip Kaludercic in issue 273 about making + this a defcustom: <https://gitlab.com/protesilaos/modus-themes/-/issues/273>. + + I first entertained the notion and did set up a branch for testing + purposes. However, I ultimately decided that such a course of action + would establish a bad precedent because then every conceivable stylistic + tweak could, in principle, become a user option. Furthermore, the + potential defcustom would introduce too much complexity as Ediff would + have to continue to behave as other diffs (per 'modus-themes-diffs') if + the user did not want the alternative style. + + As such, documenting how a user can achieve this is the right choice. + +,* Fixed internal link in the manual. Thanks to Rudolf Adamkovič for + reporting the problem in issue 277: + <https://gitlab.com/protesilaos/modus-themes/-/issues/277>. + + +Miscellaneous +============= + +,* Covered workaround for improving the accuracy of colour reproduction + in terminal emulators. The results are still not as good as the + graphical version of Emacs, though they are considerably better than + before. Thanks to gitrj95's issue 18 at the GitHub mirror, which + prompted me to research this topic: + <https://github.com/protesilaos/modus-themes/issues/18>. + +,* Helped report a bug in the PGTK build of Emacs where a new emacsclient + window with the 'modus-vivendi' face would not show the cursor: + <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=53073>. Thanks to + contributed to the discussion on issue 7 over at the GitHub mirror: + <https://github.com/protesilaos/modus-themes/issues/7> + +,* Shifted the hue of the intense 'hl-line' from a grey-cyan to a more + vivid blue by reducing the relative contribution of the green channel + of light. + + The change affects these styles: + + (setq modus-themes-hl-line '(accented intense)) + (setq modus-themes-hl-line '(accented intense underline)) + + Thanks to Rudolf Adamkovič for suggesting a more vivid colour in issue + 214: <https://gitlab.com/protesilaos/modus-themes/-/issues/214>. + +,* Recalibrated the 'modus-vivendi' named colour 'bg-paren-match'. + + I wanted to increase its distance relative to the main background, + just to be sure that it is easier to spot. This is achieved by moving + the hueness from the yellow to the magenta side of the spectrum. + + Overall, the change is subtle and has no major impact on the contrast + ratio relative to the main background and foreground (we need to + consider both due to the specifics of show-paren-mode (and related)). + + The results (#5f362f is the old, #6f3355 the new): + + | | #000000 | #ffffff | #000000 | #ffffff | + |---------+---------+---------+---------+---------| + | #5f362f | 2.06 | 10.22 | 37904 | 333060 | + | #6f3355 | 2.28 | 9.21 | 58282 | 291037 | + + The TBLFM formula for this table (org-mode notation): + + $2='(Λ $1 @1$2);%.2f :: $3='(Λ $1 @1$3);%.2f :: $4='(Δ $1 @1$4) :: $5='(Δ $1 @1$5) + + The Greek letters mean: + + (defalias 'Λ #'modus-themes-contrast) + (defalias 'Δ #'color-distance) + +,* Expanded the "special" subset of the palette with faint variants of + the four backgrounds. These are reserved for special circumstances, + as the name implies. Below are the contrast values (see + 'modus-themes-contrast'). + + Modus Operandi main accept colours against faint special backgrounds: + + | | #f0f1ff | #ebf5eb | #fef2ea | #faeff9 | + |---------+---------+---------+---------+---------| + | #a60000 | 7.15 | 7.17 | 7.29 | 7.16 | + | #972500 | 7.26 | 7.28 | 7.40 | 7.28 | + | #a0132f | 7.13 | 7.15 | 7.27 | 7.14 | + | #7f1010 | 9.44 | 9.47 | 9.63 | 9.47 | + | #702f00 | 8.94 | 8.97 | 9.12 | 8.96 | + | #7f002f | 9.64 | 9.67 | 9.83 | 9.66 | + | #005e00 | 7.20 | 7.23 | 7.34 | 7.22 | + | #315b00 | 7.13 | 7.15 | 7.27 | 7.15 | + | #145c33 | 7.18 | 7.20 | 7.32 | 7.20 | + | #104410 | 10.09 | 10.12 | 10.29 | 10.12 | + | #30440f | 9.56 | 9.59 | 9.75 | 9.58 | + | #0f443f | 9.76 | 9.79 | 9.96 | 9.79 | + | #813e00 | 7.14 | 7.17 | 7.28 | 7.16 | + | #70480f | 7.14 | 7.17 | 7.28 | 7.16 | + | #863927 | 7.13 | 7.15 | 7.27 | 7.15 | + | #5f4400 | 8.10 | 8.12 | 8.26 | 8.12 | + | #5d5000 | 7.17 | 7.19 | 7.31 | 7.19 | + | #5e3a20 | 8.91 | 8.94 | 9.09 | 8.93 | + | #0031a9 | 9.31 | 9.34 | 9.49 | 9.33 | + | #2544bb | 7.14 | 7.16 | 7.28 | 7.16 | + | #0000c0 | 10.64 | 10.67 | 10.85 | 10.66 | + | #003497 | 9.66 | 9.70 | 9.86 | 9.69 | + | #0f3d8c | 9.06 | 9.09 | 9.24 | 9.09 | + | #001087 | 13.15 | 13.20 | 13.42 | 13.19 | + | #721045 | 9.99 | 10.02 | 10.19 | 10.01 | + | #8f0075 | 7.72 | 7.75 | 7.88 | 7.74 | + | #5317ac | 8.98 | 9.01 | 9.16 | 9.00 | + | #752f50 | 8.22 | 8.25 | 8.38 | 8.24 | + | #7b206f | 8.22 | 8.25 | 8.38 | 8.24 | + | #55348e | 8.26 | 8.29 | 8.42 | 8.28 | + | #00538b | 7.18 | 7.20 | 7.32 | 7.19 | + | #30517f | 7.18 | 7.20 | 7.32 | 7.20 | + | #005a5f | 7.13 | 7.15 | 7.27 | 7.15 | + | #005077 | 7.76 | 7.79 | 7.91 | 7.78 | + | #354f6f | 7.49 | 7.52 | 7.64 | 7.51 | + | #125458 | 7.69 | 7.72 | 7.85 | 7.71 | + + Modus Vivendi main accept colours against faint special backgrounds: + + | | #0e183a | #001f1a | #241613 | #251232 | + |---------+---------+---------+---------+---------| + | #ff8059 | 7.01 | 7.01 | 7.07 | 7.00 | + | #ef8b50 | 7.01 | 7.00 | 7.07 | 7.00 | + | #ff9077 | 7.85 | 7.85 | 7.93 | 7.85 | + | #ffa0a0 | 8.91 | 8.91 | 9.00 | 8.91 | + | #f5aa80 | 9.04 | 9.04 | 9.13 | 9.04 | + | #ff9fbf | 9.06 | 9.05 | 9.14 | 9.05 | + | #44bc44 | 7.04 | 7.04 | 7.11 | 7.04 | + | #70b900 | 7.13 | 7.13 | 7.20 | 7.12 | + | #00c06f | 7.24 | 7.24 | 7.31 | 7.24 | + | #78bf78 | 7.87 | 7.86 | 7.94 | 7.86 | + | #99b56f | 7.60 | 7.59 | 7.67 | 7.59 | + | #88bf99 | 8.23 | 8.22 | 8.30 | 8.22 | + | #d0bc00 | 8.98 | 8.98 | 9.07 | 8.98 | + | #c0c530 | 9.31 | 9.31 | 9.40 | 9.30 | + | #d3b55f | 8.71 | 8.71 | 8.79 | 8.71 | + | #d2b580 | 8.81 | 8.80 | 8.89 | 8.80 | + | #cabf77 | 9.28 | 9.27 | 9.36 | 9.27 | + | #d0ba95 | 9.20 | 9.20 | 9.29 | 9.20 | + | #2fafff | 7.18 | 7.18 | 7.25 | 7.18 | + | #79a8ff | 7.32 | 7.32 | 7.39 | 7.31 | + | #00bcff | 7.96 | 7.96 | 8.04 | 7.96 | + | #82b0ec | 7.74 | 7.74 | 7.81 | 7.74 | + | #a0acef | 7.97 | 7.96 | 8.04 | 7.96 | + | #80b2f0 | 7.89 | 7.88 | 7.96 | 7.88 | + | #feacd0 | 9.94 | 9.93 | 10.03 | 9.93 | + | #f78fe7 | 8.29 | 8.29 | 8.37 | 8.29 | + | #b6a0ff | 7.82 | 7.81 | 7.89 | 7.81 | + | #e0b2d6 | 9.51 | 9.50 | 9.60 | 9.50 | + | #ef9fe4 | 8.88 | 8.88 | 8.96 | 8.87 | + | #cfa6ff | 8.72 | 8.71 | 8.80 | 8.71 | + | #00d3d0 | 9.28 | 9.27 | 9.36 | 9.27 | + | #4ae2f0 | 11.09 | 11.09 | 11.20 | 11.09 | + | #6ae4b9 | 11.08 | 11.07 | 11.18 | 11.07 | + | #90c4ed | 9.34 | 9.34 | 9.43 | 9.33 | + | #a0bfdf | 9.10 | 9.09 | 9.18 | 9.09 | + | #a4d0bb | 10.18 | 10.17 | 10.27 | 10.17 | + +,* Add docs on color overrides through blending. Thanks to Alex Griffin + for the contribution in issue 269 and the subsequent patch in merge + request 56 (the patch is exempt from copyright assignment): + + - <https://gitlab.com/protesilaos/modus-themes/-/issues/269>. + - <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/56>. + +,* Fixed typo in the ':group' value of some faces defined in + modus-themes.el. Thanks to Gustavo Barros for reporting it in issue + 266: <https://gitlab.com/protesilaos/modus-themes/-/issues/266> + +,* Updated copyright statement in all .el files to use the same wording + as all other files that are built into Emacs. + +,* Made all sorts of tweaks and refinements to doc strings and nodes in the + manual. + +Thanks again to everyone involved! This has been yet another cycle of +intense work which further iterated on an already solid base. +#+end_src + +* 2.0.0 +:PROPERTIES: +:CUSTOM_ID: h:46d92baa-eff3-4973-bac0-cf762b457e2d +:END: + +#+begin_src text +Modus themes version 2.0.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2021-12-24 + +This entry covers the changes made to the project since the publication +of version 1.7.0 on 2021-11-18. There have been more than 90 commits in +the meantime. This is a major upgrade with some backward-incompatible +changes, even though most work was done behind the scenes (i.e. not in +git commits but local testing) to guarantee the relevance of all +user-facing styles, code practices, et cetera. + +All modifications of colour combinations mentioned herein are made in +accordance with the primary accessibility objective of the themes for a +minimum contrast ratio of 7:1 between background and foreground values +in their given combination (the WCAG AAA standard for relative colour +luminance). Edits also account for colour-coding that is optimised for +the needs of users with red-green colour deficiency (deuteranopia). + +To access the URL of the manual visit this web page: +<https://protesilaos.com/emacs/modus-themes>. Or read it in the Emacs +Info reader by evaluating this form: + + (info "(modus-themes) Top") + +The 'modus-operandi' and 'modus-vivendi' themes are built into Emacs-28 +(next stable release) or later, and are available on GNU ELPA as well as +other archives. Emacs-28 ships version 1.6.0, while the current +'master' branch (i.e. Emacs-29) and, by extension, GNU ELPA include the +latest tagged release. + +A fully fledged org-mode file with the annotated task list for Modus +themes version 2.0.0 is supplied as complementary material to the +present entry. It should be annexed below this text on the announcement +page: <https://protesilaos.com/codelog/2021-12-24-modus-themes-2-0-0/>. + + +Customisation options +===================== + +There are some breaking changes that were necessary to improve the code +base and make things easier as well as more efficient for end users. +Please read carefully and apologies in advance for whatever +inconvenience. + +,* The 'modus-themes-variable-pitch-headings' no longer has any effect. + Instead, users can specify a 'variable-pitch' property to the list + they pass to the 'modus-themes-headings' or 'modus-themes-org-agenda' + (examples below). + +,* All 'modus-themes-scale-*' options are removed. Scaling of headings + is now handled directly by the user options 'modus-themes-headings' + and 'modus-themes-org-agenda' (code samples below). + +,* The 'modus-themes-headings' option now accepts a floating point (see + function 'floatp') that represents the multiplier relative to the base + font size. This can be used to scale headings accordingly. Since + this option can target individual heading levels (for 1 through 8), + users can now implement their desired scale with greater precision. + Whereas before it was limited to the first four levels, admittedly for + no good reason. + + The newly introduced 'variable-pitch' property can also be applied on + a per-level basis (making it easy to combine with existing properties, + such as a custom weight, for maximum control). Example: + + ;; This is an alist: read the manual or its doc string. + (setq modus-themes-headings + '((1 . (variable-pitch light 1.6)) + (2 . (overline semibold 1.4)) + (3 . (monochrome overline 1.2)) + (4 . (overline 1.1)) + (t . (rainbow 1.05)))) + +,* The 'modus-themes-org-agenda' follows the same design as the + 'modus-themes-headings' where appropriate. Headings that can be + scaled accept a floating point, while those that may be rendered in a + proportionately spaced font accept the 'variable-pitch' property. In + addition, a custom font weight is also supported in the relevant + places (just as with 'modus-themes-headings'). Overall, the interface + can now be tailored to the user's preferences with greater precision. + + ;; This is an alist: read the manual or its doc string. + (setq modus-themes-org-agenda + '((header-block . (variable-pitch light 1.6)) + (header-date . (bold-today grayscale underline-today 1.2)) + (event . (accented varied)) + (scheduled . uniform) + (habit . traffic-light))) + +,* The 'modus-themes-scale-small' that was used in the Org agenda + interface has been removed. No replacement is provided, as the + downsizing had the undesired effect of breaking the otherwise neat + alignment of elements on the grid. + +,* The 'modus-themes-mode-line-padding' option has been removed. + Instead, users can specify a natural number (positive integer) + directly in the list of properties passed to the + 'modus-themes-mode-line' variable. This has no effect when the + 'moody' property is also set, because the Moody library applies its + own padding. For example: + + (setq modus-themes-mode-line '(borderless accented 4)) + + Though not related to changes on our end, users of Emacs 29 must now + set 'x-use-underline-position-properties' to nil for padding to work + properly (due to other adjustments upstream). This relates to Emacs + bug#52324 we had reported: + <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=52324>. + +,* All deuteranopia styles are consolidated in a single toggle: + 'modus-themes-deuteranopia'. The 'modus-themes-success-deuteranopia' + is thus rendered obsolete and superseded, while the individual + deuteranopia-friendly styles for diffs ('modus-themes-diffs') and the + Org agenda's habit graph ('modus-themes-org-agenda') are altogether + removed. As opposed to top-level forms, there is no clean way to + notify the user of the deprecation of individual values of a user + option. + +,* The "foreground only" style has been altogether removed from the user + option 'modus-themes-diffs'. It never was up to the aesthetic + standard of the themes even though the colours met the minimum 7:1 + contrast ratio. There is a new section in the manual which documents + how to implement such a style with user-level configurations. Short + version: + + (defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + `(modus-themes-diff-added ((,class :background unspecified :foreground ,green))) ; OR ,blue for deuteranopia + `(modus-themes-diff-changed ((,class :background unspecified :foreground ,yellow))) + `(modus-themes-diff-removed ((,class :background unspecified :foreground ,red))) + + `(modus-themes-diff-refine-added ((,class :background ,bg-diff-added :foreground ,fg-diff-added))) + ;; `(modus-themes-diff-refine-added ((,class :background ,bg-diff-added-deuteran :foreground ,fg-diff-added-deuteran))) + `(modus-themes-diff-refine-changed ((,class :background ,bg-diff-changed :foreground ,fg-diff-changed))) + `(modus-themes-diff-refine-removed ((,class :background ,bg-diff-removed :foreground ,fg-diff-removed))) + + `(modus-themes-diff-focus-added ((,class :background ,bg-dim :foreground ,green))) ; OR ,blue for deuteranopia + `(modus-themes-diff-focus-changed ((,class :background ,bg-dim :foreground ,yellow))) + `(modus-themes-diff-focus-removed ((,class :background ,bg-dim :foreground ,red))) + + `(modus-themes-diff-heading ((,class :background ,bg-alt :foreground ,fg-main))) + + `(diff-indicator-added ((,class :foreground ,green))) ; OR ,blue for deuteranopia + `(diff-indicator-changed ((,class :foreground ,yellow))) + `(diff-indicator-removed ((,class :foreground ,red))) + + `(magit-diff-added ((,class :background unspecified :foreground ,green-faint))) + `(magit-diff-changed ((,class :background unspecified :foreground ,yellow-faint))) + `(magit-diff-removed ((,class :background unspecified :foreground ,red-faint))) + `(magit-diff-context-highlight ((,class :background ,bg-dim :foreground ,fg-dim)))))) + + ;; This is so that the changes persist when switching between + ;; modus-operandi and modus-vivendi + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) + + +Removed support for packages +============================ + +The following are no longer supported by the themes. The reasons vary +in each case, though they boil down to (i) the package being obsoleted, +or (ii) the package's faces inheriting from base faces that we already +support (e.g. font-lock). Each case was carefully considered as part of +the comprehensive review of all packages supported by the themes, though +chances are that some mistake was made regardless. If you believe a +package should not have been removed, please report as much. + +,* ag +,* apt-sources-list +,* apt-sources-list +,* buffer-expose +,* counsel-org-capture-string +,* define-word +,* diredc +,* disk-usage +,* easy-kill +,* flyspell-correct +,* git-gutter{,fringe}+ +,* git-lens +,* git-walktree +,* highlight-blocks +,* highlight-defined +,* highlight-escape-sequences +,* highlight-symbol +,* highlight-tail +,* hyperlist-mode +,* isl (isearch-light) +,* minibuffer-line +,* mu4e-conversation +,* no-emoji +,* objed +,* parrot +,* phi-search +,* pkgbuild-mode +,* rainbow-identifiers +,* sallet +,* spell-fu +,* spray +,* swoop +,* vdiff +,* volatile-highlights + + +Changes to supported faces or face groups +========================================= + +,* Eliminated any possible exaggerations in wgrep faces. Those no longer + use coloured backgrounds. Instead they have colour-coded foreground + colours as well as a bold weight (they ultimately inherit from the + 'bold' face, which is a "hidden" customisation option, as explained in + the manual). + +,* Forced Org block delimiters to not extend their background by default + (though check 'modus-themes-org-blocks'). That was the intended + design all along, but now it needs to be made explicit. See, for + example, bug#52587 for Emacs: + <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=52587> + +,* Revised the 'org-sexp-date' face so that it no longer looks like + 'org-date'. Dates are clickable buttons: they work like links, so + they have an underline by default and are subject to the + 'modus-themes-links' user option. Whereas the 'org-sexp-date' is not + applied to interactive elements and must thus be visually distinct. + + This face is used for diary-style entries in Org files. For example: + + %%(diary-anniversary 2000 12 25) NAME %d%s birthday + +,* Rewrote several Auctex/Tex faces to inherit from base faces where + relevant (e.g. 'bold', 'success') as well as from font-lock faces. In + the latter case, the end-result makes Auctex/Tex subject to the + 'modus-themes-syntax' option. These refinements promote theme-wide + consistency without detracting from the established styles. + +,* Improved Git (Magit) commit faces for warnings or errors. This + concerns two cases: + + 1. The summary line exceeds the recommended limit of 50 characters. + This now uses a yellow foreground colour which contrasts well with + the summary line's new blue hue (blue and yellow are complementary + for our purposes, meaning that they have good contrast in hueness). + + 2. The second line (the one right below the summary) has text that + should not be there. This one is coloured in a shade of red, which + again contrasts well with blue. + + Thanks to Damien Cassou for noticing in issue 261 that the previous + style of applying tinted backgrounds did not work well when + 'hl-line-mode' was enabled ('hl-line-mode' overrides backgrounds and + so the warnings/errors where not always obvious): + <https://gitlab.com/protesilaos/modus-themes/-/issues/261>. + +,* Added support for the new 'magit-branch-warning' face that we helped + upstream define: <https://github.com/magit/magit/issues/4550>. It + disambiguates warnings in Magit status buffers from the generic and + often inappropriate for such a context 'font-lock-warning-face'. + +,* Simplified all the Apropos faces. They no longer look like buttons or + links as that makes the presentation of 'M-x apropos' very busy. + Instead, they now only have a foreground colour. + +,* Updated support for org-roam faces by removing old entries and + covering new ones. + +,* Replaced old company-mode faces with their new aliases: + + - company-scrollbar-bg => company-tooltip-scrollbar-thumb + - company-scrollbar-fg => company-tooltip-scrollbar-track + +,* Made 'org-column-title' inherit from 'fixed-pitch' when the user + option 'modus-themes-mixed-fonts' is non-nil. This is needed to line + up columns correctly. Thanks to Björn Lindström for the contribution + in merge request 52: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/52>. + +,* Forced the 'org-colview' faces to use the same height, even when + headings are scaled (see 'modus-themes-headings'). This ensures that + the columns are aligned properly and text fits on the same row. + Thanks to Björn Lindström for the contribution in merge request 53: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/53>. + +,* Refrained from applying a bold weight to the Org date selection + indicator in the calendar. The use of bold has the potential to create + problems with the alignment of dates for certain typefaces that do not + have a proper bold variant. Also, there is no need for added emphasis + given that we already use a prominent background colour. + +,* Made 'M-x org-table-header-line-mode' or the third-party package + 'org-table-sticky-header' use colours that fit better with those of + tables. + +,* Removed explicit styling of the 'magit-branch-current' face because + its definition checks if the ':box' attribute can be set and if not, it + uses ':inverse-video'. Useful for terminal emulators. + +,* Expanded support for the 'mode-line-active' face for Emacs29. The + face upstream basically adds proportionately spaced fonts (the + 'variable-pitch' face) to the mode line. The themes can already use + that if the user option 'modus-themes-variable-pitch-ui' is non-nil. + Thanks to Manuel Uberti for the feedback in issue 257: + <https://gitlab.com/protesilaos/modus-themes/-/issues/257>. + +,* Implemented some stylistic refinements for ERC and Rcirc to ensure + theme-wide consistency (e.g. timestamps are a shade of cyan). + +,* Tweaked adoc-mode faces for stylistic theme-wide consistency. + +,* Refashioned all the git faces of Treemacs so that they are more + consistent with other such contexts or uses. The new styles also + conform with the 'modus-themes-deuteranopia' option. + + +Miscellaneous +============= + +,* Ended the wanton use of internal functions in places that did not + require them. Instead, the themes define faces that evaluate such + functions once and pass their results to the relevant entries. Cases + include: + + - Symlink and/or broken link faces in contexts such as Dired, + Eshell, Helm, Trashed. + + - Tabbed interfaces (tab-bar, tab-line, centaur-tabs). + + - Verbatim markup or that of inline code in Org, Markdown, Asciidoc, + etc. + + - The optional use of 'variable-pitch' for User Interface elements + (see 'modus-themes-variable-pitch-ui'). + +,* Refined the dedicated diff background colours of modus-vivendi that + are used when the user option 'modus-themes-deuteranopia' is non-nil. + The changes improve the distinction between all red and yellow + constructs in contexts where they appear together (e.g. smerge-mode). + Basically, yellows will look more bright, while reds appear as + brown. The corresponding blues are toned down a bit to be consistent + with the other colours. Consequently, the standard shades of green + for added lines (when 'modus-themes-deuteranopia' is nil) are + recalibrated to combine well with all other values. + +,* Made several faces return an 'unspecified' value instead of nil for + their unused attributes under certain circumstances. This is to guard + against third-party code that unconditionally expects a non-nil value. + +,* Omitted {over,under}line attributes from the mode line when the + 'padded' property is added to the 'modus-themes-mode-line' user + option. Those are not necessary in that context. Thanks to Illia + Ostapyshyn for the contribution in merge request 54: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/54> + +,* Rewrote several internal functions in the interest of consistency and + clarity. + +,* Deleted two user options that were long obsolete: (i) + 'modus-themes-org-habit' has been superseded by + 'modus-themes-org-agenda' since version 1.5.0 of the themes and (ii) + 'modus-themes-intense-hl-line' has been replaced by + 'modus-themes-hl-line' since version 1.3.0. + +,* Removed parentheses from headings in the manual as they are invalid + characters for some version of Texinfo. See Emacs bug#52126: + <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=52126>. + +,* Updated all doc strings so that quoted lists yield valid syntax in + Help buffers; syntax that can be directly evaluated (otherwise Emacs + prettifies straight quotes as curly ones, which break the code). + Thanks to Christian Tietze for bringing this issue to my attention: + <https://gitlab.com/protesilaos/modus-themes/-/issues/248#note_753169268>. + +,* Rewrote all sections of the manual to document the current state of + the project as pertains to valid user options, explicitly supported + face groups, and so on. +#+end_src + +* 1.7.0 +:PROPERTIES: +:CUSTOM_ID: h:22de7065-f54c-4944-b47f-3cc8a30551c8 +:END: + +#+begin_src text +Modus themes version 1.7.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2021-11-18 + +The present entry records the changes made to the project since the +release of version 1.6.0 on 2021-09-29. There have been more than 60 +commits since then. + +Every modification pertaining to colour combinations referenced herein +is implemented in accordance with the primary accessibility objective of +the themes for a minimum contrast ratio of 7:1 between background and +foreground values in their given combination (the WCAG AAA standard). +Edits also account for colour-coding that is optimised for the needs of +users with red-green colour deficiency (deuteranopia). + +To access the URL of the manual visit this web page: +<https://protesilaos.com/emacs/modus-themes>. Or read it from Emacs by +evaluating this form: + + (info "(modus-themes) Top") + +The themes are built into Emacs version 28 (next stable release), and +are available on GNU ELPA as well as other archives. This release is +the first one that is included with Emacs 29, or else the 'master' +branch in emacs.git. + + +Customisation options +===================== + ++ The 'modus-themes-no-mixed-fonts' has been deprecated and replaced by + the 'modus-themes-mixed-fonts'. This is a breaking change for users + who want to use "mixed fonts": they must set the new variable to + non-nil. + + As the name implies, the new variable changes the meaning of the + feature to make it opt-in by default. This is consistent with the + principle of least surprise, as users may not know why some fonts look + different than others in certain cases. + + Thanks to Christian Tietze for clarifying the doc string of this new + user option in merge request 51: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/51>. + + For context, "mixed fonts" refers to a design where spacing-sensitive + constructs, such as code blocks and Org tables, inherit from the + 'fixed-pitch' face to remain monospaced (and properly aligned) at all + times. Depending on the user's configurations, the 'fixed-pitch' face + may not use the typeface that the user expects. + + The manual provides information on how to set the desired fonts by + editing the 'default', 'fixed-pitch', and 'variable-pitch' faces. + ++ The new 'modus-themes-mode-line-padding' can be used to control the + apparent padding of the mode line when the user option + 'modus-themes-mode-line' includes the 'padded' property. The padding + must be a positive integer (otherwise the code would be needlessly + complex to guard against values that make the mode line look awkward, + like anything lower than -3 or maybe even -2). + + Thanks to Guilherme Semente and Manuel Uberti for the feedback in + issue 245: <https://gitlab.com/protesilaos/modus-themes/-/issues/245>. + + Note that the out-of-the-box style of the themes has a padding of 1 + (technically a ':line-width' of 1 for the ':box' attribute), whereas + the default style of Emacs has it at -1. This is a design choice to + avoid an overlap between the outer boundaries of a font's glyphs and + the borders of the mode line, when using certain common typefaces at + various point sizes. Such an overlap can hinder readability. + + The manual contains a new Do-It-Yourself (DIY) section with detailed + code samples on how to apply a negative value. + ++ The new 'modus-themes-intense-markup' option can be set to non-nil to + make constructs such as inline code and verbatim text more colourful. + This has a general utility, though its consideration was prompted by a + phenomenon reported by Stefan Kangas in issue 238 where the overlay of + the 'hl-line-face' overrides the subtle background these constructs + use and can thus make them virtually indistinguishable from ordinary + text: <https://gitlab.com/protesilaos/modus-themes/-/issues/238>. + + Such is the standard behaviour of 'hl-line-mode' and there is nothing + a theme can (or rather "should") do about it. Thanks to Stefan Kangas + for the feedback. + ++ The 'modus-themes-headings' option can now accept and apply an exact + font weight such as 'semibold' or 'light'. (The list of available + weights is the value of the 'modus-themes--heading-weights' internal + variable.) This supersedes the now-deprecated 'no-bold' property: + 'no-bold' is henceforth understood as the presence of a 'regular' + weight. + + Recall that this user option is an alist and can be used to target + heading levels individually, which further reinforces the utility of + this new property. + + Thanks to Christian Tietze for suggesting this idea in issue 248: + <https://gitlab.com/protesilaos/modus-themes/-/issues/248>. And + thanks to Daniel Mendler for refining its implementation in commit + 54bfd62, which was sent as a patch file (yes, we accept those and I + actually prefer them over a web app's UI). + ++ The 'modus-themes-org-agenda' has seen improvements to its 'event' key + (this is an alist that has multiple keys). It now accepts a 'varied' + property which differentiates between (i) plain timestamp entries and + (ii) entries that are generated from either the diary or a symbolic + expression. The 'varied' property combines with the other available + properties to particularise their effects. Consult the doc string or + the manual for the technicalities. + + Thanks to Gustavo Barros for the detailed commentary in issue 241: + <https://gitlab.com/protesilaos/modus-themes/-/issues/241>. + ++ The 'modus-themes-lang-checkers' now accepts a 'faint' property. This + has the effect of toning down the colours in use. By default, the + only colour is that of the underline, though more can be added by + combining the properties accepted by this user option. Consult its + doc string or the manual for further details. + + Thanks to Morgan Smith for suggesting the idea in issue 239: + <https://gitlab.com/protesilaos/modus-themes/-/issues/239>. + + +Add support for new packages or face groups +=========================================== + ++ 'company-tooltip-deprecated' face. Thanks to Roman Rudakov for the + feedback in issue 247: <https://gitlab.com/protesilaos/modus-themes/-/issues/247>. + ++ 'corfu-default' face. Thanks to Daniel Mendler (Corfu's developer) + for the feedback in issue 254: + <https://gitlab.com/protesilaos/modus-themes/-/issues/254>. + ++ 'image-dired' package (Emacs 29). Thanks to Stefan Kangas for making it + happen in emacs.git and for the feedback in issue 250: + <https://gitlab.com/protesilaos/modus-themes/-/issues/250>. + ++ 'nano-modeline' package. + ++ 'vertico-quick' package. Thanks to Nicolas De Jaeghere for the + contribution in merge request 48: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/51>. + + +Changes to existing faces or face groups +======================================== + ++ Added support for the new Org agenda faces that improve the + contextuality of various views. We implemented those upstream for Org + version 9.5 in close cooperation with Gustavo Barros. Thanks to + Gustavo for the detailed feedback in issue 241: + <https://gitlab.com/protesilaos/modus-themes/-/issues/241>. The + thread about the patch upstream: + <https://list.orgmode.org/87lf7q7gpq.fsf@protesilaos.com/> + ++ Refined Org agenda date faces in the interest of consistency and in + accordance with the aforementioned change. Thanks again to Gustavo + Barros for the discussion in issue 241. + ++ Applied the 'shadow' face more consistently across all contexts where + only a subtle foreground value is expected. This design choice makes + it possible for users to manually edit the foreground colour of + 'shadow' to something even more subtle than the 'fg-alt' palette + variable we use, which maps to a gray colour (e.g. they could use + "gray50"). + ++ Implemented a subtle background colour to the 'widget-inactive' face. + This makes it easier to discern inactive buttons, checkboxes, and the + like, in contexts such as the Customize User Interface. Thanks to + Stefan Kangas for the feedback in issue 242: + <https://gitlab.com/protesilaos/modus-themes/-/issues/242>. + ++ Tweaked 'file-name-shadow' to also use italics (inherit from the + 'italic' face) in order to be more easy to distinguish it from + ordinary text in the minibuffer. + + Recall that the manual documents the meaning of inheriting from the + 'bold' and 'italic' faces instead of hardcoding a bold weight and an + italic slant, respectively. In short: users can change the weight to + what they want (e.g. semibold) and/or use distinct font families. + ++ Amplified the style of Version Control (VC) warnings and errors to let + them draw more attention to themselves (because these indicators need + to be acted upon). + ++ Recoloured the 'custom-group-tag' face to make it fit better in its + context and be consistent with the rest of the themes' established + patterns. + ++ Made marks for selection in Dired, Ibuffer, and related, conform with + the 'modus-themes-success-deuteranopia' option. This means that they + use blue colours when the option is non-nil, instead of their default + shades of green. + ++ Adjusted the box width of key bindings for Emacs 28 or higher. They + should no longer cause any alignment issues. This style is now used + throughout the themes, including in transient views (e.g. Magit) which + were the exception before. Thanks to Manuel Uberti and Kevin Fleming + for the feedback in issue 232: + <https://gitlab.com/protesilaos/modus-themes/-/issues/232>. + + +Miscellaneous +============= + ++ Wrote a brief description of every user option in the manual. Also + covered its type, as in boolean, alist, et cetera. + ++ Corrected the mode line border width for one combination of properties + in the 'modus-themes-mode-line' option. This should now have the same + height as all others: + + (setq modus-themes-mode-line '(accented borderless)) + ++ Ensured that mode line attributes would not be set to nil, but kept at + an 'unspecified' value instead, where relevant. This avoids problems + with [faulty] code that unconditionally depends on something that does + not exist, as in the following while ':box' is nil: + + (face-attribute 'mode-line :box) + ++ Expanded, reworded, or otherwise improved the manual, based on the + aforementioned. + +Thanks once again to everyone involved! +#+end_src + +* 1.6.0 +:PROPERTIES: +:CUSTOM_ID: h:e4b9945c-1db8-4626-abc9-372469b19253 +:END: + +#+begin_src text +Modus themes version 1.6.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2021-09-29 + +This entry records the changes made to the project since the release of +version 1.5.0 on 2021-07-15. There have been around 70 commits since +then. + +Every colour-related modification referenced herein is always +implemented in accordance with the primary accessibility objective of +the themes for a minimum contrast ratio of 7:1 between background and +foreground values in their given combination (the WCAG AAA standard). +Such edits also account for colour-coding that is optimised for the +needs of users with red-green colour deficiency (deuteranopia or +variants). + +Here is the URL of the manual: <https://protesilaos.com/emacs/modus-themes>. +Or read it from Emacs by evaluating this form: + + (info "(modus-themes) Top") + +The themes are built into Emacs version 28 (current development target), +and are available on GNU ELPA as well as other archives. This release +is the final one for the emacs-28 branch, as that gets cut as the next +stable release of GNU Emacs. Future releases will target Emacs 29 once +that becomes the new 'master' branch. + + +Customisation options +===================== + +[ Themes need to be reloaded for changes to take effect. ] + ++ Introduced the new 'modus-themes-tabs-accented' boolean option. When + set to non-nil, it renders the background of all tab interfaces in a + shade of blue. Those interfaces are tab-bar (built-in), tab-line + (built-in), and Centaur tabs. + + - The background "accented" colour is the same as the one used for + mode lines when 'modus-themes-mode-line' is configured accordingly. + ++ Tweaked the 'modus-themes-mode-line' to accept a 'padded' symbol as + part of the list of properties it can read. This will increase the + spacing around the mode lines' text, making the line taller overall + but also more spacious. + + Thanks to Manuel Uberti for making the proposal and providing feedback + in issue 228: <https://gitlab.com/protesilaos/modus-themes/-/issues/228>. + ++ Added the 'modus-themes-scale-small' which complements the existing + scale values with one that is meant to be smaller than the base + height. This option is reserved for special cases and is currently + only used as an opt-in feature in the Org agenda. + ++ Expanded the 'modus-themes-org-agenda' with more parameters: + + - The current date can now also be underlined. + - Date headings can be scaled/enlarged in size. + - Events, like those of the Diary or sexp entries, can be customised. + + Consult the manual or the variable's doc string for the details. + ++ Removed the obsoleted aliases 'modus-themes-slanted-constructs' and + 'modus-themes-scale-5'. Those are superseded by the more + appropriately named 'modus-themes-italic-constructs' and + 'modus-themes-scale-title'. + + Thanks to Nicolas De Jaeghere for the patch in merge request 47: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/47>. + + +Faces and face groups +===================== + ++ Make the 'prodigy' faces for red/green/yellow inherit from the faces + 'error'/'success'/'warning', respectively. This is done to (i) avoid + duplication and (ii) ensure that the green/success colour coding is + consistent with the goal of the themes to empower users with red-green + colour deficiency. The boolean option that changes all such greens to + shades of blue is 'modus-themes-success-deuteranopia'. + ++ Assigned the ':extend' attribute to the 'org-code' face. This is + necessary when the Org source contains lines that start with a colon + sign. Those are interpreted as code blocks. For example: + + : #+BEGIN_SRC emacs-lisp + : (defun in-interval (bounds el) + : (and (>= el (car bounds)) (<= el (cadr bounds)))) + : #+END_SRC + + With the ':extend' in place, the background stretches to the edge of + the window, thus giving those lines a uniform rectangular shape. For + inline uses of 'org-code', the background should remain limited to the + span of the text. + ++ Broadened support for 'marginalia' faces in two phases. + + - The first pertained to the file permissions that are shown when + completing against file paths. Their style is similar to what + 'dired+' or the 'direfl' packages provide, however we have taken + care to optimise the interface for the purposes of completion + UIs---where things can look like Dired, we make them alike, but + where they must differ, we differentiate the designs accordingly. + There can be no compromises or arbitrary constraints. + + Also read: <https://github.com/minad/marginalia/pull/91>. + + - The second batch covered all sorts of extra classes that provide + granular control over the appearance of Marginalia instances. + Refinements also had to be made to already-supported faces for the + sake of achieving consistency across the various Marginalia + interfaces. + + Also read: <https://github.com/minad/marginalia/pull/92>. + ++ Refined 'diredfl' and 'dired+' faces. For the various "priv" faces, + the intent is to increase the difference in hueness between adjacent + file permissions (the changes are minor, but they do change the + overall result). Numbers are toned down so that they do not clash + with dates. The file suffix no longer uses cyan to stand out more in + detailed views. + ++ Made 'icomplete-selected-match' (Emacs28) more legible by aligning its + presentation with metaphors that are estaslished across the + modus-themes. Thanks to Kévin Le Gouguec (peniblec) for noting the + inconsistency with the new face upstream and for writing the patch for + it in merge request 50: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/50>. + Also thanks to Manuel Uberti for confirming that things would look + consistent in the comments' section of that merge request. + ++ Fixed faulty inheritance for the 'web-mode-keyword-face'. It should + now properly copy the attributes of 'font-lock-keyword-face'. + ++ Made inheritance of the new 'help-key-binding' (Emacs28 key) the + default for all faces that need to style key bindings. + + In Emacs 28 all key bindings are automatically displayed with the face + 'help-key-binding' which uses some new face attributes to draw a + cleaner box around it. Given that the themes must work with earlier + versions of Emacs, we cannot inherit it unconditionally so we added + the relevant conditionality. It is nice to offer this feature to + those who use the themes on Emacs 28. Older versions retain the + previous style of a blue colour coupled with a bold weight. + + The exception to this rule is the transient.el faces (this is the + pop-up window used by Magit, among others---transient.el is now built + into Emacs). The box effect creates unpredictable misalignments, so + we default to the old key binding style for those. + + Thanks to Manuel Uberti and Kevin Fleming for their feedback in issue + 232: <https://gitlab.com/protesilaos/modus-themes/-/issues/232>. + ++ Added support for the new 'notmuch-jump-key' face. I contributed this + face in commits c37c9912, 5cc106b0 to the Notmuch git repo: + <https://git.notmuchmail.org/git/notmuch>. + ++ Updated the 'bookmark-face' (Emacs28) as it has been changed upstream + to be a fringe indicator instead of an in-buffer, line-wide background + highlight. + ++ Aligned Ediff faces with other 'modus-themes-diffs' styles. Before we + would differentiate a "focus state", though that is now considered + surplus to requirements. The notion of a "focus state" only make + sense in Magit which applies variegated colour-coding to diff hunks + based on their state. Whereas non-active Ediff changes are grayed + out, so there is no need for further colour-coding nuances. The most + noticeable change is with: + + (setq modus-themes-diffs 'bg-only) + + As noted in the commit message of 64c74ae (from 2021-09-04): + + If users think this change is for the worse, we can always define a + helper function like this: + + (defun modus-themes--ediff-style (bgonly default) + "Diff style for Ediff. + BGONLY and DEFAULT depend on the value of `modus-themes-diffs'. + The former is more subtle." + (if (eq modus-themes-diffs 'bg-only) + (list bgonly) + (list default))) + + And apply it thus: + + `(ediff-current-diff-A ((,class :inherit ,@(modus-themes--ediff-style + 'modus-themes-diff-removed + 'modus-themes-diff-focus-removed)))) + + No feedback was received towards that end in about a month, so we + consider the change to be acceptable, without prejudice to the + possibility of future updates. + ++ Unified the styles of 'org-agenda-calendar-sexp', 'org-agenda-diary', + and 'org-agenda-calendar-event'. This is not a user-facing change but + an internal refactoring to avoid repetition. It also makes things + easier for the implementation of the 'modus-themes-org-agenda' (as + mentioned above). + ++ Ensured that the 'bookmark-menu-bookmark' face inherits from the + 'bold' face. By default it hardcodes the bold weight, whereas we + instruct it to inherit the 'bold' face. A user can thus change the + ':weight' of that face to whatever they want, like semibold, + extrabold, etc. We do this throughout the themes for bold and + italics---consider it a "hidden feature" of sorts. Check the manual + for more on the matter: + + (info "(modus-themes) Configure bold and italic faces (DIY)") + ++ Provided support for tab-bar groups (Emacs28). Specifically the faces + 'tab-bar-tab-group-current' and 'tab-bar-tab-group-inactive'. + + Thanks to Adam Porter (alphapapa) for the feedback in issue 8 over at + the Github mirror: <https://github.com/protesilaos/modus-themes/issues/8>. + ++ Decoupled the 'stripes' face from that of 'hl-line-face'. This is + because the stripes are not meant to change depending on the value of + the user option 'modus-themes-hl-line'. + ++ Revised the red shade of "flagged" entries in mu4e and notmuch. Those + are now consistent with Gnus. The shade of red that was used before + was closer to the orange side of the spectrum whereas the current has + hints of blue (a cherry colour) and thus combines better with the cyan + and blue that prevail in those interfaces. These are fine margins, + though the effect is noticeable regardless. + ++ Configured the new 'ansi-color' faces (Emacs28) which are used by + shells and terminals (among others). Thanks to Manuel Uberti for + reporting the changes to upstream Emacs in issue 236: + <https://gitlab.com/protesilaos/modus-themes/-/issues/236>. + ++ Expanded support for EMMS faces, pertaining to its browser views. + Thanks to Feng Shu (tumashu) for bringing those to my attention in + issue 11 over at the Github mirror: + <https://github.com/protesilaos/modus-themes/issues/11>. + ++ Styled the new 'tab-line-tab-modified' face (Emacs28). It should now + use a faint red colour to denote changes to the underlying file. + Thanks to Adam Porter (alphapapa) for bringing it to my attention in + issue 12 over at the Github mirror: + <https://github.com/protesilaos/modus-themes/issues/12>. + ++ Configured the single face that the 'cursor-flash' package has to + offer. Thanks to Manuel Uberti for the feedback in issue 231: + <https://gitlab.com/protesilaos/modus-themes/-/issues/231>. + ++ Included 'elpher' in the list of supported packages by means of + covering the heading faces it implements. + ++ Recalibrated certain dedicated colours for inactive tabs and tweaked + tab faces to (i) marginally improve the default aesthetic and (ii) + harmonise it with the style of 'modus-themes-tabs-accented'. + ++ Removed the foreground attribute from all markup faces that are meant + to denote emphasis in italics. That is because such faces are + typically composed with others, so we do not wish to inadvertently + override any other colour that would otherwise have taken effect. + ++ Wrote the faces for upstream Org that improve the contextuality of + various agenda views (included in version 9.5). This was done in + close collaboration with Gustavo Barros who offered detailed feedback + in issue 208 (which also led to the creation and eventual expansion of + the 'modus-themes-org-agenda' user option): + <https://gitlab.com/protesilaos/modus-themes/-/issues/208>. + + Four new faces improve certain styles and offer more flexibility for + some Org agenda views: 'org-agenda-date-weekend-today', + 'org-imminent-deadline', 'org-agenda-structure-secondary', + 'org-agenda-structure-filter'. They inherit from existing faces in + order to remain backward-compatible. + + Quoting from <https://list.orgmode.org/87lf7q7gpq.fsf@protesilaos.com/>: + + + The 'org-imminent-deadline' is useful to disambiguate generic + warnings from deadlines. For example, a warning could be + rendered in a yellow colored text and have a bold weight, + whereas a deadline might be red and styled with italics. + + + The 'org-agenda-structure-filter' applies to all tag/term + filters in agenda views that search for keywords or patterns. + It is designed to inherit from 'org-agenda-structure' in + addition to the 'org-warning' face that was present before (and + removes the generic 'warning' face from one place). This offers + the benefit of consistency, as, say, an increase in font height + or a change in font family in 'org-agenda-structure' will + propagate to the filter as well. The whole header line thus + looks part of a singular design. + + + The 'org-agenda-structure-secondary' complements the above for + those same views where a description follows the header. For + instance, the tags view provides information to "Press N r" to + filter by a numbered tag. Themes/users may prefer to + disambiguate this line from the header above it, such as by + using a less intense color or by reducing its height relative to + the 'org-agenda-structure'. + + + The 'org-agenda-date-weekend-today' provides the option to + differentiate the current date on a weekend from the current + date on weekdays. + +Other patches I have made to, inter alia, emacs.git and org.git with +regard to faces are documented in previous change log entries. + + +Documentation +============= + ++ Removed references to old versions of the themes from before their + refactoring in version 1.0.0. Those old packages no longer exist. + Users must install the 'modus-themes' and then load either of + 'modus-operandi' or 'modus-vivendi'. + ++ Included various extensions of the Vertico package in the list of + indirectly supported packages. Those define faces which either + inherit from basic ones that we already support or use colours that + are consistent with our accessibility target. + ++ Referenced 'side-hustle', 'tide', 'bufler' as an indirectly supported + packages for the same reasons. + ++ Simplified time-stamp local variables that are used in modus-themes.el + to show the time the file was edited. We apply 'time-stamp-pattern' + instead of setting multiple time-stamp variables. Thanks to Stephen + Gildea for the patch, which was sent to me via email (yes, you can + always do that). + ++ Updated the manual's "acknowledgements" section to name all new + contributors to code/ideas/feedback. + ++ Furnished information on how to configure the 'highlight-parentheses' + package and extend its faces for use with the themes. The entry + provides a complete Elisp implementation. + ++ Improved the code samples for the prism.el setup that users may wish + to set up by themselves. The new lists of colours work better when + Prism's colouration is limited to a small set of hues. + ++ Deleted trailing whitespace in the manual which had adverse effects + when trying to compile the modus-themes.org over at emacs.git. Thanks + to Philip Kaludercic for the patch in merge request 49: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/49>. + +Thanks again to everyone involved. Looking forward to see the Modus +themes, version 1.6.0, as part of the next stable release of Emacs. +#+end_src + +* 1.5.0 +:PROPERTIES: +:CUSTOM_ID: h:05fc633d-69d6-4b5e-aade-1f9e4ba30ed3 +:END: + +#+begin_src text +Modus themes version 1.5.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2021-07-15 + +This entry outlines the set of changes made to the project since the +release of version 1.4.0 on 2021-05-25. There have been over 130 +commits since then. + +Every colour-related modification referenced herein is always +implemented in accordance with the primary accessibility objective of +the themes for a minimum contrast ratio of 7:1 between background and +foreground values in their given combination (the WCAG AAA standard). +Such edits also account for colour-coding that is optimised for the +needs of users with red-green colour deficiency (deuteranopia or +variants). + +Here is the URL of the manual: <https://protesilaos.com/emacs/modus-themes>. +Or read it from Emacs by evaluating this form: + + (info "(modus-themes) Top") + +The themes are built into Emacs version 28 (current development target), +and are available on GNU ELPA as well as other archives. + + +Customisation options +===================== + +Overview of new style of sets of properties +------------------------------------------- + +Several variables now accept a list of symbols as a value. Those +represent properties, which can be combined with each other to realise +the possible styles. The idea was to simplify their specification in +order to make them easier to both maintain and extend. Thanks to Philip +Kaludercic for introducing this concept in issue 210: +<https://gitlab.com/protesilaos/modus-themes/-/issues/210>. + +The variables are: + ++ 'modus-themes-prompts' by Philip Kaludercic in merge request 43: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/43> + ++ 'modus-themes-mode-line' by Philip Kaludercic in merge request 40: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/40>. + ++ 'modus-themes-lang-checkers' by Philip Kaludercic in merge request 46: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/46> + ++ 'modus-themes-org-agenda' ++ 'modus-themes-links' ++ 'modus-themes-headings' ++ 'modus-themes-hl-line' ++ 'modus-themes-paren-match' ++ 'modus-themes-region' ++ 'modus-themes-syntax' + +Take 'modus-themes-syntax' as an example. Up until version 1.4.0, it +would only accept a symbol, signifying a predefined style. So we had +the possible value 'faint' and another 'faint-yellow-comments'. To make +a third variant of the "faint" aesthetic, such as by combining it with +the "alt syntax" and/or "green strings", we would need to write new +presets in the form of 'faint-green-strings', 'faint-alt-syntax', +'faint-alt-syntax-green-strings', 'faint-green-strings-yellow-comments', +'faint-alt-syntax-green-strings-yellow-comments'. That would have been +inefficient, hence why it was not done. + +With the new approach of defining a list of properties, those +combinations are all possible. Such as: + + (setq modus-themes-syntax '(faint alt-syntax)) + + (setq modus-themes-syntax '(yellow-comments alt-syntax green-strings)) + +The order in which the properties are set is not significant. + +The doc string of each of the aforementioned variables, or the +corresponding entry in the manual, provides guidance on how to configure +things. The old forms will continue to work for the time being, though +they are considered deprecated and will stop being supported at a future +date. + + +Changes in stylistic variants for variables with sets of properties +------------------------------------------------------------------- + ++ The meaning of the "alt syntax" style in 'modus-themes-syntax' has + been redefined. In the past, it used to have green-coloured strings + and doc strings. Those are now red. Some other changes have been + implemented to make the overall looks more consistent. Users who + liked the old style can retain it by passing this list of properties: + + (alt-syntax green-strings) + + New styles for the "faint" aesthetic are possible, here shown as lists + of properties: + + (faint green-strings) + (faint alt-syntax) + (faint alt-syntax green-strings) + + To each of those the 'yellow-comments' property can be added as well. + + Consult the doc string or the manual for the technicalities and code + samples. + ++ The 'modus-themes-hl-line' no longer has styles that include only an + underline. Those proved to be problematic under certain circumstances + and were thus removed. + + Minor changes have been implemented to make the following combination + of properties more consistent, by colourising the underline: + + (accented intense underline) + ++ The 'modus-themes-paren-match' now has styles that include an + 'underline' property. Those extend the old options, such as: + + (bold intense underline) + ++ The 'modus-themes-headings' have an improved set of styles for the "no + text color" aesthetic. Those involve the 'monochrome' property, which + can now yield results that include a background (whereas before it was + just colourless text for the headings, optionally without a bold + weight). As this is an alist, here is an example (always check the + docs for fully fledged code samples): + + (setq modus-themes-headings + '((1 . (background overline)) + (2 . (overline background rainbow)) + (t . (monochrome no-bold background)))) + + To allow a heading level N to retain its original style, a 't' value + can be passed. In the previous version of the themes, it was possible + to use 'nil' for the same purpose, though that is no longer valid. In + those cases, the fallback value of the alist will be used instead, + such as what is noted above: + + (t . (monochrome no-bold background)) + ++ The 'modus-themes-links' provide several new possible styles, due to + an expanded set of properties that includes, among others, 'bold', + 'italic', and 'background'. The documentation covers the details. + ++ The 'modus-themes-lang-checkers' can now attain a style that uses a + prominently coloured background in addition to what was available + before as a subtle background and the other variants. + + +New variables +------------- + ++ The 'modus-themes-org-agenda' provides the means to refashion the + entirety of the Org agenda buffer. The value it accepts is an alist, + with some keys expecting a symbol and others a list of properties. + The minutia are covered in its doc string. A possible configuration + can look like this: + + (setq modus-themes-org-agenda + '((header-block . (variable-pitch scale-title)) + (header-date . (grayscale workaholic bold-today)) + (scheduled . uniform) + (habit . traffic-light))) + + 'modus-themes-org-agenda' supersedes the old variable that was specific + to the Org habit graph: 'modus-themes-org-habit'. There now is a + 'habit' key which accepts the same values as before, plus a new style + that is optimised for users with red-green colour deficiency: + 'traffic-light-deuteranopia'. Please consult the doc string of + 'modus-themes-org-agenda' or the relevant entry to the manual. + + Thanks to Gustavo Barros for contributing to the creation of this + variable as well as to all other changes in the relevant faces that + were done in the interest of usability. A full report about + 'modus-themes-org-agenda' with screen shots is available here: + <https://protesilaos.com/codelog/2021-06-02-modus-themes-org-agenda/>. + + A patch has been sent to upstream Org, with its review pending, which + improves upon some of the areas we had identified: + <https://lists.gnu.org/archive/html/emacs-orgmode/2021-06/msg00092.html>. + ++ The 'modus-themes-inhibit-reload' controls a new behaviour of + automatically reloading the active theme when an option is set via the + Custom interfaces or with 'customize-set-variable'. To opt-in to this + feature, set the variable to a 'nil' value. + + Thanks to Philip Kaludercic for implementing this in merge request 40: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/40>. + + In the development phase of this option, a bug was identified + pertaining to recursion, as reported by Gustavo Barros in issue 213: + <https://gitlab.com/protesilaos/modus-themes/-/issues/213>. Changes + have been made to remove that possibility, as found in merge request + 45: <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/45>. + + A thread was started on the emacs-devel mailing list to inquire upon + the technicalities of this option, but it did not gain any traction: + <https://lists.gnu.org/archive/html/emacs-devel/2021-06/msg00828.html>. + + As such, we have decided to take our chances by pressing on with this + feature. Users who are interested in it are encouraged to give it a + try and report any possible complications. Issue 213 remains open. + ++ The 'modus-themes-italic-constructs' is the new name of the variable + 'modus-themes-slanted-constructs'. The term "slant" was considered + too vague or technical and some users could have missed the meaning of + this option. + ++ The 'modus-themes-scale-5' is renamed to 'modus-themes-scale-title' to + better convey its utility. + + +Changes to the manual +===================== + ++ Rewrote or introduced the documentation for all the customisation + options mentioned above. Also updated relevant code samples, such as + in the manual's introduction to the customisation options. Evaluate + this form for an annotated code overview: + + (info "(modus-themes) Customization Options") + ++ Rephrased a reference to "gamma ray values" as "gamma values". Thanks + to Anders Johansson for the contribution in merge request 42: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/42>. + ++ Removed the Org macro that would insert the build date in the manual's + introduction. This was required to make the file reproducible, + otherwise it would keep changing each time a new version of Emacs was + built. Refer to Emacs bug#48661 by Glenn Morris: + <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=48661>. + ++ Included note on tweaking the key hints that the Avy package produces. + This is in response to issue 215 by Rudolf Adamkovič: + <https://gitlab.com/protesilaos/modus-themes/-/issues/215>. Thanks to + Nicolas De Jaeghere for providing the text. + ++ Wrote a note on how to control the underlines that are generated in + compilation-mode buffers and related. It is about configuring the + variable 'compilation-message-face'. + ++ Documented how to configure the colours that are applied to the names + of the days in the 'M-x calendar' interface. The relevant variable is + 'calendar-weekend-days'. + ++ Elaborated on a "do it yourself" (DIY) guide on how to benefit from + the hidden feature of the themes about how they handle the bold weight + and the italic slant. In short, we do not hardcode values and thus + make it easy for users to specify the particularities of what it means + for a face to have a 'bold' or 'italic' attribute. + + +Faces and face groups +===================== + +New entries +----------- + +Newly supported packages: + ++ 'ledger-mode'. Thanks to Pengji Zhang for the feedback in issue 202: + <https://gitlab.com/protesilaos/modus-themes/-/issues/202>. + ++ 'gotest'. Thanks to Jerry Zhang for the feedback in issue 226: + <https://gitlab.com/protesilaos/modus-themes/-/issues/226>. + ++ 'css-mode' + +New faces for already supported groups: + ++ 'shr-h1', 'shr-h2', 'shr-h3', 'shr-h4', 'shr-h5', 'shr-h6' of the + shr.el library (simple HTML renderer, as experienced in, for example, + EWW). Those are available for Emacs28, with a patch by me: + <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=49433> + ++ 'apropos-button' as a generic face that fontifies faces in apropos + buffers. Available for Emacs28, with a patch by me: + <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=49162>. + ++ 'selectrum-mouse-highlight'. This makes the mouse hover effect for + selectrum look the same as in most other contexts. Thanks to okamsn + for the feedback in issue 203: + <https://gitlab.com/protesilaos/modus-themes/-/issues/203>. + + +Review of existing entries +-------------------------- + ++ Added an ':extend' property to 'next-error' face. This face is used + for pulse effects. It is good to have them extend to the edge of the + window, so that they are easier to spot. Thanks to Gustavo Barros for + the feedback in issue 200, which is about pulse.el: + <https://gitlab.com/protesilaos/modus-themes/-/issues/200>. + ++ Tweaked the various Apropos faces. The idea was to remove the colour + from the pseudo headings so that we would not get an exaggerated + result of too much variety in the buffer (e.g. that of 'M-x apropos'). + The individual buttons retain their style as links, meaning that they + are governed by the variable 'modus-themes-links'. + ++ Revised 'whitespace-line' face to make it look like a warning, as it + ought to be. Thanks to Pengji Zhang for the feedback in issue 204: + <https://gitlab.com/protesilaos/modus-themes/-/issues/204>. + ++ Reworked the colour-coding of the Hydra and Transient packages. These + are meant to tone down some excesses with the standard red and to + adapt other colours to it. Thanks to Gustavo Barros for providing + suggestions and helping me tweak those in issue 206: + <https://gitlab.com/protesilaos/modus-themes/-/issues/206>. + ++ Recoloured 'transient-argument' to improve its uniqueness in its + context and to better comply with the expectation of hydra-style + colour coding, as noted right above. + ++ Made the 'org-agenda-done' face conform with the customisation option + 'modus-themes-success-deuteranopia'. This means that it will be + coloured in blue instead of green when the option is set to a non-nil + value. + ++ Grayed out the foreground of the Org block delimiter lines on the + premise that any extra colouration was not needed, given the presence + of a gray background and the overall markup of the block. + ++ Toned down the colouration of the 'org-code' face, so that it is + consistent with 'org-verbatim' as well as the colours used in opening + and closing lines of blocks. Thanks to Gustavo Barros for suggesting + this change in issue 206, though it went through a couple of reviews: + <https://gitlab.com/protesilaos/modus-themes/-/issues/206>. + ++ Simplified the inheritance of the 'fixed-pitch' face, which is used + for internal purposes to ensure alignment of elements in buffers that + must cope with mixed font configurations, such as an org-mode file + with 'M-x variable-pitch-font' enabled. + + [ Recall that the option 'modus-themes-no-mixed-fonts' can disable + this feature. Also note that the 'mixed-fonts' package, or + equivalent, is not needed while using the Modus themes (though there + is nothing wrong with having them together). ] + ++ Reduced the overall intensity of 'org-mode-line-clock-overrun'. + Thanks to Gustavo Barros for the feedback in issue 208: + <https://gitlab.com/protesilaos/modus-themes/-/issues/208>. + ++ Simplified or otherwise tweaked several Org agenda faces to render + possible the new 'modus-themes-org-agenda' variable, as documented + above. Thanks to Gustavo Barros for the feedback in issue 208: + <https://gitlab.com/protesilaos/modus-themes/-/issues/208>. + ++ Increased ever so slightly the foreground colour of the 'highlight' + face. This can help improve the perception of highlights, such as + upon hovering over a link with the mouse. Thanks to Rudolf Adamkovič + for reporting the potential problem in issue 216: + <https://gitlab.com/protesilaos/modus-themes/-/issues/216>. + ++ Prevented the override of the 'diff-context' face when users assign a + 'bg-only' value to the 'modus-themes-diffs' variable. This makes it + consistent with the intent of this style, which is to work with a + non-nil value for 'diff-font-lock-syntax' (basically to allow the + usual colour highlights of the underlying code syntax in diff + buffers). + ++ Ensured consistency of all prompt-related faces by introducing a new + face, 'modus-themes-prompt', that is inherited by all others (all + prompt styles are controlled by the variable 'modus-themes-prompts'). + This was originally implemented with the 'comint-highlight-prompt' + face, though that could potentially lead to undefined faces if the + comint library was not loaded. Whereas the 'modus-themes-prompt' + guarantees that we pass a known face at all times. Thanks to Philip + Kaludercic for bringing this potential bug to my attention in a + comment to merge request 43: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/43#note_615224855>. + ++ Removed the background colour from the 'widget-inactive' face. It + would create problems in some cases, such as in Custom buffers for + multiple choice options. + ++ Refined 'calendar-weekend-header' and 'calendar-weekday-header' to + emulate the design of physical calendars and remain truthful to the + expectations set by the default configuration of the calendar.el + library. Weekends now use a faint red, while weekdays are rendered in + the same subtle gray they had before. The underlying principle is to + make weekends convey a subtle warning to the effect that "this is not + a day for work" (notwithstanding precarious economic realities). As + noted above, there is an entry in the manual on how to make all days + look the same, be it gray or faint red. Evaluate this form: + + (info "(modus-themes) Note on calendarel weekday and weekend colors") + + +Request for feedback on a potential version 2.0.0 of the Modus themes +===================================================================== + +While we maintain a cautious stance towards preserving the default +styles, there are some cases where we might be forced to introduce +backward-incompatible changes. + +Three such cases that can benefit from user feedback are: + ++ Issue 196 on 'modus-themes-no-mixed-fonts' + <https://gitlab.com/protesilaos/modus-themes/-/issues/196>. + ++ Issue 198 on 'modus-themes-hl-line' + <https://gitlab.com/protesilaos/modus-themes/-/issues/198> + + [ Note that 'modus-themes-hl-line now accepts a list of properties as + described in the opening sections of this entry. ] + ++ Issue 218 on 'modus-themes-diffs' + <https://gitlab.com/protesilaos/modus-themes/-/issues/218>. + + +Miscellaneous +============= + ++ Recalibrated the value of the colour 'bg-hl-line-intense' in the + palette 'modus-themes-vivendi-colors'. The change should be + practically indecipherable, though it slightly improves things in + certain contexts. + ++ Refined the intensity of the three main yellow colours in + 'modus-themes-vivendi-colors'. + ++ Introduced a new 'modus-themes-faces' group so that those are + decoupled from the customisation options in the various Custom + buffers. Thanks to Philip Kaludercic for the patch in merge request + 39: <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/39>. + ++ Updated the manual's "Acknowledgements" section to include all new + users who contributed to the project. + +Thanks again to everyone involved! + + +#+end_src + +* 1.4.0 +:PROPERTIES: +:CUSTOM_ID: h:4c643e3c-5284-4fab-97e8-217bc1c02f5d +:END: + +#+begin_src text +Modus themes version 1.4.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2021-05-25 + +This entry records the changes made to the project since the release of +version 1.3.0 on 2021-04-17. There have been around 100 commits in the +meantime, as is the norm. + +If you are coming from older versions, please consult the change log +entry for version 1.0.0 with regard to the breaking changes that were +introduced. + +Every colour-related modification is always done in accordance with the +overarching accessibility objective of the themes for a minimum contrast +ratio of 7:1 between background and foreground values in their given +combination (the WCAG AAA standard). + +URL of the official manual: <https://protesilaos.com/emacs/modus-themes>. Or +read it with Emacs' Info reader by evaluating this form: + + (info "(modus-themes) Top") + +Remember that the themes are built into Emacs version 28 (current +development target), and are available on GNU ELPA, as well as other +archives. + + +Customisations variables +------------------------ + ++ Redefined the style of 'fg-only' that 'modus-themes-diffs' accepts, so + that it no longer uses a red-green colour coding, but applies a + red-blue distinction instead. The symbol 'fg-only' is a deprecated + alias for the more descriptive 'fg-only-deuteranopia'. + + This is done because green text on a light background is one of the + worst combinations for the purposes of legibility, as it does not + stand out in its context and thus forces undesirable compromises. + Whereas red and blue work well in this case, while making the style + accessible to users with red-green colour deficiency (deuteranopia). + To avoid inconsistencies between Modus Operandi and Modus Vivendi, we + replace green with blue in both themes. A full report is available in + issue 183 which was created on April 21, 2021: + <https://gitlab.com/protesilaos/modus-themes/-/issues/183>. + ++ Introduced the boolean 'modus-themes-success-deuteranopia' which + replaces all instances of green with blue in contexts where a + red-green colour coding is in effect (e.g. Org TODO vs DONE keywords, + isearch current match...). + ++ Implemented 'modus-themes-mail-citations' to control the colouration + of cited text in email-related buffers, such as Gnus or message.el. + It accepts values nil, 'faint', and 'monochrome'. By default (the nil + value) the text of citations cycles through blue, green, red, yellow + depending on the level of depth. + ++ Expanded the set of options for 'modus-themes-mode-line' to encompass + the values 'borderless-accented', 'borderless-accented-3d', and + 'borderless-accented-moody'. Those are variations of existing styles. + The complete list: + + - nil (default) + - 3d + - moody + - borderless + - borderless-3d + - borderless-moody + - accented + - accented-3d + - accented-moody + - borderless-accented + - borderless-accented-3d + - borderless-accented-moody + ++ Renamed the non-nil values that 'modus-themes-org-blocks' accepts from + 'grayscale', 'rainbow' to 'gray-background' and 'tinted-background', + respectively. The new symbols better describe their effect on Org + source blocks, namely, that they affect the background of the block + rather than the foreground. The old symbols will still work but are + considered deprecated aliases of the newer ones. + ++ Altered the intensity of the 'modus-themes-hl-line' option + 'accented-background' to a more noticeable shade of cyan/teal. The + old style was too subtle to have the desired effect. The value + 'underline-accented' is not affected by this change, as it still uses + the same subtle background it did before in combination with a more + pronounced underline colour. + ++ Deleted all deprecation warnings that concerned the transition from + version 0.13.0 of the themes to 1.0.0. Those had been in effect for + several months, spanning four tagged releases. + + +Faces or face groups +-------------------- + ++ Reconsidered the use of colour in all email-related citation faces to + avoid exaggerations and reduce complexity. Colour values have been + tweaked to tone down their overall intensity, while the number of + colours has been reduced to four. Gnus and Mu4e have faces for more + levels of citation depth, though those will simply repeat the + four-colour cycle. + ++ Made the 'message-mml' face look consistent with the rest of the + buffer while composing an email by changing its foreground colour from + a yellow to a cyan variant. + ++ Refined several faces in the Notmuch group in the interest of harmony: + + - Individual message headers in 'notmuch-show-mode' use bold text in + addition to their existing subtle background to better stand out in + their context. The face is 'notmuch-message-summary-face'. + + - Tags are no longer set unconditionally to a bold typographic weight. + They become such for unread threads in 'notmuch-search-mode' + buffers, as well as for headers of 'notmuch-show-mode'. + + - Removal and addition of tags is now denoted by a strike-through and + an underline effect, respectively, whereas before they both used + underlines with the only difference being their colour. + + - The subject line in 'notmuch-search-mode' buffers uses the main + foreground instead of a dimmed one. The field of matching authors + has a tweaked foreground to keep the tabular view easy to read. + + - All cryptography-related faces are simplified to not show a coloured + background but only use a foreground colour instead. + ++ Removed direct support for 'counsel-notmuch' as it already inherits + from the relevant notmuch faces. The package is thus considered + indirectly supported. + ++ Refrained from setting a background to the 'csv-separator-face' as it + would inevitably colourise the negative space in the tabular view + created by 'csv-align-mode'. A red text colour is used instead, even + though this is not common practice: it is easier to spot for small, + single characters, such as a comma or a semicolon that is meant to + have a special meaning. Thanks to Kevin Fleming for reporting the + problem and for offering feedback on the choice of colour in issue + 194: <https://gitlab.com/protesilaos/modus-themes/-/issues/194>. + ++ Distinguished between ordinary links and widget buttons by removing + the underline from the latter (the 'widget-button' face) and altering + the shade of its foreground colour. Such widgets are used in Emacs' + Custom interfaces and can also be found in the default Notmuch "hello" + buffer that runs 'notmuch-hello-mode'. + ++ Tweaked the Ediff current faces to be consistent with 'diff-mode' and + related. In practice, this only applies when 'modus-themes-diffs' is + set to a value of 'fg-only-deuteranopia', as it adds a dim background + to the current diff hunk. All other styles of 'modus-themes-diffs' + look the same as before while using Ediff. + ++ Simplified the faces of 'corfu' to match the current state of the + upstream project. Thanks to Daniel Mendler (its developer) for + reporting this in issue 184: + <https://gitlab.com/protesilaos/modus-themes/-/issues/184>. + ++ Refined all Eshell faces so that the output of 'ls' is consistent with + the overall aesthetic of the themes. Also made 'eshell-prompt' + inherit from 'comint-highlight-prompt' to look the same as other such + prompts (all are configurable by 'modus-themes-prompts'). + ++ Revised 'eshell-prompt-extras' and 'eshell-git-prompt' to use colours + and typographic weight that better match the style of the various + configurations they offer. + ++ Simplified 'eshell-syntax-highlighting' to inherit from the standard + Eshell faces, where appropriate. + ++ Adjusted the colour of 'centaur-tabs-active-bar-face' and removed the + bespoke 'fg-tab-accent' colour from 'modus-themes-operandi-colors' and + 'modus-themes-vivendi-colors' that was only used by it (and which + should have never been introduced to begin with). + ++ Updated the 'tab-bar-groups' faces to match changes upstream. Thanks + to Fritz Grabo (its developer) for the patch in merge request 35: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/35>. + ++ Changed the Ibuffer title and group faces to better differentiate + between group titles and special or non-file-visiting buffers. Thanks + to Nicolas De Jaeghere for the patch in merge request 37: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/37>. + ++ Ensured that all faces that denote a "success" state, or which are + expected to be coloured in green in a red-green binary, can use an + appropriate blue colour (or colour combination that involves blue) + instead when 'modus-themes-success-deuteranopia' is set to a non-nil + value. + ++ Added support for the new 'bookmark-face' in Emacs version 28. This + means that the built-in bookmark.el library is directly supported by + the themes. This face can be disabled by setting 'bookmark-fontify' + to nil. Thanks to Mark Barton for reporting the presence of this new + face and for providing feedback on its style in issue 189: + <https://gitlab.com/protesilaos/modus-themes/-/issues/189>. + ++ Aligned 'hes-mode' ('highlight-escape-sequences') with the standard + font-lock faces for regexp grouping. This means that it conforms with + changes to the 'modus-themes-syntax' variable. + ++ Reconfigured the 'org-quote' face to adapt its style depending on the + value of 'modus-themes-org-blocks'. The default is a subtle blue/cold + foreground colour against the main background. When a value of + 'gray-background' is assigned to 'modus-themes-org-blocks', the text's + colour becomes that of the main foreground in order to maintain a good + level of legibility. Thanks to Rudolf Adamkovič for the feedback in + issue 190: <https://gitlab.com/protesilaos/modus-themes/-/issues/190>. + ++ Refashioned the 'show-paren-match-expression' face to make it apply a + bespoke background colour and not override the expression's foreground + colours. This face is used by 'show-paren-mode' when the + customisation variable 'show-paren-style' is set to the 'expression' + value. Thanks to Rudolf Adamkovič for the feedback in issue 191: + <https://gitlab.com/protesilaos/modus-themes/-/issues/191>. + ++ Made headings level 8 use a fine shade of magenta by default instead + of gray (notwithstanding user changes to 'modus-themes-headings'). + This should have a negligible difference in Org or Outline buffers, + but is more noticeable when editing Elisp in Emacs28 while also using + 'outline-minor-mode' and with 'outline-minor-mode-highlight' set to + 'override'. That is because several top-level forms use that heading + level with those configurations. + + +Documentation (the manual) +-------------------------- + ++ Incorporated a sample configuration block with all customisation + variables and with comment annotations of their available options, in + an attempt to make it easier for users to discover what the themes + provide. + ++ Replaced all instances of "modeline" with "mode line" for consistency + with the Emacs style. Thanks to Rudolf Adamkovič for the patch that + started this process in merge request 33: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/33>. + ++ Wrote note on setting mode line faces that indicate the state of + 'god-mode'. Thanks to Rudolf Adamkovič for the feedback in issue 187: + <https://gitlab.com/protesilaos/modus-themes/-/issues/187>. Also + thanks to Rudolf for updating the applicable hook in merge request 34: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/34>. + ++ Listed 'org-mode' variables that affect fontification in blocks: + 'org-src-fontify-natively', 'org-fontify-whole-block-delimiter-line', + and 'org-fontify-quote-and-verse-blocks'. This complements the + already documented variables 'org-fontify-whole-heading-line' and + 'org-fontify-done-headline' that pertain to headings. + ++ Included note on fontifying inline Latex expressions in Org buffers. + Thanks to Rudolf Adamkovič for the feedback in issue 190: + <https://gitlab.com/protesilaos/modus-themes/-/issues/190>. + ++ Elaborated on the use of 'face-remap-add-relative' by means of sample + code that cycles through arbitrary colours for the 'region' face. + This is filed under the "Do It Yourself" (DIY) section. + ++ Provided a DIY method for adapting the fontification of Org source + block delimiter lines to the value of 'modus-themes-org-blocks'. + ++ Expanded the DIY entry on overriding the saturation of the active + theme's colours with a method that combines the programmatic approach + with manual overrides. The user can thus specify the colour values + they want to override and let the rest be handled by Elisp. + ++ Introduced a section with answers to Frequently Asked Questions (FAQ) + about the design of the themes as well as recommendations on how to + ensure optimal reading conditions or start thinking about them. The + questions are: + + - Is the contrast ratio about adjacent colors? + - What does it mean to avoid exaggerations? + - Why are colors mostly variants of blue, magenta, cyan? + - What is the best setup for legibility? + + +Miscellaneous +------------- + ++ Removed superfluous code from internal functions and adapted their + indentation to make them easier to read. + ++ Recalibrated some values in 'modus-themes-vivendi-colors' to ensure + consistency in luminance with other colours that are used in their + context. Those are subtle changes that can only be discerned in + side-by-side comparisons of the before and after states. Thanks to + André Alexandre Gomes for the feedback in issue 193: + <https://gitlab.com/protesilaos/modus-themes/-/issues/193>. + ++ Changed the saturation and hueness of the bespoke 'fg-comment-yellow' + in 'modus-themes-operandi-colors' and 'modus-themes-vivendi-colors' to + better contrast with its context, while still keeping its luminance + consistent with its role as a colour for comments in code. This is + used when 'modus-themes-syntax' is configured appropriately (read its + doc string or consult the manual). + ++ Attempted to add explicit support for the faces of the built-in + pulse.el library, but ultimately opted against them as the doc string + of 'pulse-highlight-face' advises against customising it, even though + it is not clear from the source code in emacs.git what the problem + could be. We shall reconsider this case for the next release cycle. + Thanks to Gustavo Barros for the feedback on several aspects of this + topic in issues 185 and 200: + + - <https://gitlab.com/protesilaos/modus-themes/-/issues/185> + - <https://gitlab.com/protesilaos/modus-themes/-/issues/200> + ++ Took the feedback of John Haman in issue 199 as a reminder to complete + the set of possible values for the 'modus-themes-mode-line' variable: + <https://gitlab.com/protesilaos/modus-themes/-/issues/199>. +#+end_src + +* 1.3.0 +:PROPERTIES: +:CUSTOM_ID: h:5063c0c5-832e-4577-936e-d602b07d6d79 +:END: + +#+begin_src text +Modus themes version 1.3.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2021-04-17 + +This entry records the changes introduced to the project since the +publication of version 1.2.0 (2021-03-04). There have been around 100 +commits in the meantime, as is the norm with all releases hitherto. + +Every colour-related modification documented herein conforms with the +overarching accessibility objective of the themes for a minimum contrast +ratio of 7:1 between background and foreground values in their given +combination (the WCAG AAA standard). + +As the official manual is referenced several times throughout this log, +make sure to store its URL: <https://protesilaos.com/emacs/modus-themes>. Or +read it from Emacs' Info reader by evaluating this form: + + (info "(modus-themes) Top") + +If you are coming from older versions, please consult the change log +entry for version 1.0.0 with regard to the breaking changes that were +introduced. + +Remember that the themes are built into Emacs28, and are available on +GNU ELPA, as well as other archives. + + +Customisation options +--------------------- + ++ The old 'modus-themes-intense-hl-line' boolean variable has been + replaced by 'modus-themes-hl-line', which provides several options for + how to style the current line of 'hl-line-mode'. To retain the old + effect, one must do this: + + ;; Replacement for (setq modus-themes-intense-hl-line t) + (setq modus-themes-hl-line 'intense-background) + + The list of possible values: + + 1. nil (default) + 2. intense-background + 3. accented-background + 4. underline-neutral + 5. underline-accented + 6. underline-only-neutral + 7. underline-only-accented + + The doc string of 'modus-themes-hl-line' as well as the manual + describe the specifics. Thanks to Manuel Uberti for the feedback in + commit b020592: + <https://gitlab.com/protesilaos/modus-themes/-/commit/b020592e1a96d6e00d7d03faf9c293ec6081d49c>. + ++ The 'modus-themes-mode-line' variable now accepts three new "accented" + styles that complement the existing set: + + 1. nil (default) + 2. 3d + 3. moody + 4. borderless + 5. borderless-3d + 6. borderless-moody + 7. accented + 8. accented-3d + 9. accented-moody + ++ The 'modus-themes-region' is extended with two new options of an + "accent" background: + + 1. nil (default) + 2. no-extend + 3. bg-only + 4. bg-only-no-extend + 5. accent + 6. accent-no-extend + ++ The default value of 'modus-themes-headings' for per-level styles can + now be set to nil. This fixes an inconsistency between the fallback + value, which accepted nil, and the per-level styles which did not. + Thanks to Mauro Aranda for reporting this in issue 163: + <https://gitlab.com/protesilaos/modus-themes/-/issues/163>. + + Please read the manual for the specifics of this variable, as it is an + alist that accepts several possible combinations. + + +Updates to the manual +--------------------- + ++ Rewrote the sections that cover the aforementioned customisation + options. + + - For 'modus-themes-mode-line', we had to revise the recommendation + for setting 'face-near-same-color-threshold' to 45000. That value + is appropriate for the 'moody' and 'borderless-moody' options. + Whereas for 'accented-moody' the number should be raised to 70000. + Thanks to Nicolas De Jaeghere for providing this piece of + information: + <https://gitlab.com/protesilaos/modus-themes/-/commit/ab6ba698269f012ec880b690282264649bfb3b0d#note_551342198> + ++ Rephrased the GNU Free Documentation License quote to match the style + of other manuals that are also built into Emacs. + ++ Documented 'org-mode' variables that affect the looks of various + fontification styles. + ++ Simplified the 'kbd' macro that is declared in modus-themes.org to + allow GNU ELPA's build system to parse the file for Emacs 26. + ++ Documented existing support for 'tab-bar-mode' and 'tab-line-mode'. + ++ Wrote a note on how to configure the 'dimmer.el' library by Neil + Okamoto, in order to guarantee consistent results with the themes. + The key is to use the RGB colour space instead of CIELAB. + ++ Included note on shr.el fonts and how those are used by EWW and + Elfeed. + ++ Added a "Do-It-Yourself" (DIY) section on how to remap buffer-local + faces. + ++ Detailed a DIY method to make the buffer-local backdrop of a pdf-tools + page use a distinct colour than the default white for Modus Operandi. + Extended the same principle to Modus Vivendi and described how to + adapt to theme changes (such as via 'modus-themes-toggle'). Thanks to + Utkarsh Singh for providing feedback on this topic in issue 175: + <https://gitlab.com/protesilaos/modus-themes/-/issues/175>. + ++ Elaborated on DIY techniques to programmatically override the + saturation of all colours specified by the active Modus theme. Thanks + to user pRot0ta1p for the feedback in issue 166: + <https://gitlab.com/protesilaos/modus-themes/-/issues/166>. + + +Support for packages +-------------------- + +These are added to the already comprehensive list of explicitly +supported packages: + ++ corfu ++ embark + ++ pandoc-mode. Thanks to Farasha Euker for the feedback in issue 171: + <https://gitlab.com/protesilaos/modus-themes/-/issues/171>. + ++ tab-bar-groups ++ telega ++ vertico + +Also added support for the 'help-key-binding' face which is part of +Emacs 28. + + +Changes to already supported faces or face groups +------------------------------------------------- + ++ Renamed all internal faces that the themes defined from + "modus-theme-*" to "modus-themes-*". + ++ Refashioned all Ediff faces in the process of a major review of this + tools' overall design. The manifold changes are: + + - All inactive diffs respect the underlying fontification + (e.g. programming syntax highlighting). Before they would override + it with a gray foreground. + + - All inactive diffs have been toned down, as their background is a + finer shade of gray than the prominent one that was used before. + + - There no longer is a visual distinction between even and odd + inactive diffs (by means of different shades of gray). We are of + the opinion that such subtleties, whose utility is marginal at best, + have no place in themes that are designed for accessibility. + + - All bespoke gray colour combinations that were only intended for + those inactive diffs have thus been removed from each theme's + palette. + + - Active diffs follow the same style as diff-mode, to ensure + theme-wide consistency (all diff styles are controlled by the + variable 'modus-themes-diffs'). + + This topic was discussed at length (with screenshots) in issue 169: + <https://gitlab.com/protesilaos/modus-themes/-/issues/169>. Thanks to + peniblec and Nicolas De Jaeghere for their feedback. + ++ Made 'smerge-markers' and 'vdiff-closed-fold-face' look like the + headings in 'diff-mode' in the interest of consistency, especially + while configuring the 'modus-themes-diffs' variable. + ++ Ensured consistency between all faces that pertain to key bindings in + contexts where the hint to the key is active, in that pressing the key + performs the action (e.g. Magit's transient buffers, which-key,...). + The 'help-key-binding' for Emacs 28 is not included in this group, + because it applies in cases where the keys are not active, such as in + Help buffers. + ++ Refined 'epa-validity-disabled' and 'epa-validity-high' faces. The + former no longer uses a background, as that was considered an + exaggeration. While the latter is cast in a cyan hue instead of green + for greater clarity (this relates to the general push to optimise for + red-green colour deficiency, which means to only use green where it is + absolutely necessary and, in such cases, to provide for a blue-ish + alternative, as with the 'deuteranopia' value that can be assigned to + 'modus-themes-diffs'). + ++ Reworked 'ace-window', 'avy', and 'magit-blame' faces to ensure that + their overlays do not inherit the face properties of underlying text, + such as a different font family or height. Thanks to Nicolas De + Jaeghere for the multiple merge requests and the concomitant feedback: + + - <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/27>. + - <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/29>. + - <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/30>. + - <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/31>. + - <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/32>. + + Also thanks to Damien Cassou for reporting an intermediate problem + with 'avy' in issue 177; a problem that was eventually addressed by + Nicolas De Jaeghere in merge request 31 (cited above): + <https://gitlab.com/protesilaos/modus-themes/-/issues/177>. + ++ Optimised the colour combinations used by 'avy' to improve the + distinction between consecutive characters. + ++ Reduced the brightness of EWW certificate faces, as they would attract + disproportionate attention to themselves. + ++ Reworked all EWW text field and button faces to look more like what + they are supposed to. + ++ Removed the slant and distinct foreground from the 'org-quote' face, + as they would interfere with emphasis within the quote block. Thanks + to Farasha Euker for the feedback in issue 171: + <https://gitlab.com/protesilaos/modus-themes/-/issues/171>. + ++ Reduced the intensity in colouration of 'org-code' and 'org-macro' in + order to avoid exaggerations and prevent their compounding effect in + technical documents that include a high concentration of those faces. + They still retain their overall character and continue to look like + variants of 'org-verbatim'. + ++ Extended support for Selectrum's new 'selectrum-quick-keys-highlight' + and 'selectrum-quick-keys-match'. + ++ Adjusted a few bongo faces for improved consistency and a more + pleasant result overall. Quote from commit 07224cda08: + + Refine bongo faces for consistency + + The previous design was meant to keep the track fields distinct + from each other. However the use of yellow was not good + aesthetically: it does not fit with the rest of the theme. + + Upon further experimentation, I realised that the album field + (yellow) is only present when the artist and title fields are also + available: first is the title, then the artist, and finally the + album. This is true even with 'bongo-join-inserted-tracks' set to + a non-nil value. So changing the face from yellow to a neutral + value is safe. + + The other two faces are adapted to look better in the new context. + ++ Made more command prompt faces respond to changes in the variable + 'modus-themes-prompts'. This concerns faces from the groups cider, + circe, erc, indium, rcirc. + ++ Refashioned typescript faces, making them more prominent by default, + while also exposing them to the value of 'modus-themes-syntax'. + ++ Revised the style of 'info-colors-ref-item-command'. This makes + commands look the same as functions, which is technically correct. It + also predicates the exact style on the value of the variable + 'modus-themes-syntax'. + ++ Made all enh-ruby-mode faces adapt to 'modus-themes-syntax'. Same for + julia. + ++ Reconfigured all ztree faces for stylistic consistency. The + 'ztreep-diff-model-add-face' now responds to the 'deuteranopia' value + that can be passed to 'modus-themes-diffs'. + ++ Appended the ':extend t' attribute to 'gnus-summary-cancelled' and + 'gnus-summary-selected'. These are only noticeable on Emacs 28 + following commit 88409b21c2 in emacs.git. + ++ Tweaked all faces of 'highlight-changes-mode' to better deliver on the + intent of that mode. + ++ Opted to unconditionally render all 'dired-async' faces in a bold + typographic weight, instead of basing them on a non-nil value for + 'modus-themes-bold-constructs'. Also changed 'dired-async-message' to + a blue foreground, which further improves the themes' performance for + red-green colour deficiency. + ++ Adjusted the colours of some 'notmuch-crypto-*' faces to better convey + their meaning. + ++ Removed remaining conditional logic for underline styles in some + spell- and linter- related faces to ensure that all such cases are + controlled by the variable 'modus-themes-lang-checkers' (building on + work that had been done in the past). + ++ Stopped changing 'keycast-key' to match the modeline style, as that + diluted the meaning of the variable 'modus-themes-mode-line'. + ++ Tweaked calendar and diary faces for stylistic effect, except for the + 'diary' face which has been converted from a green to a blue variant + for the purposes of coping with cases of red-green colour deficiency. + + +Miscellaneous +------------- + ++ Clarified the changes in the backward-incompatible transition from + version 0.13.0 of the themes to >= 1.0.0. Thanks to Damien Cassou for + reporting the absence of easy-to-find information in issue 174: + <https://gitlab.com/protesilaos/modus-themes/-/issues/174>. + ++ There were three point releases after 1.2.0 which refined certain + aspects of the themes' packaging so that they could work both as + built-in themes for Emacs as well as in package format via the likes + of GNU ELPA. Those issues were eventually resolved by Basil + L. Contovounesios: + + - Issue 162: <https://gitlab.com/protesilaos/modus-themes/-/issues/162>. + - Emacs bug#45068: <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=45068#218>. + ++ Rewrote the 'modus-themes-headings' variable's declaration to improve + its presentation in Custom interfaces. Thanks to Mauro Aranda for + submitting the patch for commit 1c60927ebd. + ++ Applied the ':format' keyword to all 'defcustom' forms, based on the + aforementioned patch. This should make all options look better in the + various Custom interfaces. Thanks to Mauro Aranda for the feedback in + issue 163: <https://gitlab.com/protesilaos/modus-themes/-/issues/163>. + ++ Refined the colour values 'bg-alt' and 'bg-dim' in 'modus-vivendi' to + improve their instantiation on Textual User Interfaces. In + particular, recalibrated the blue channel of light so that when the + TUI cannot render the colour directly, it defaults to a gray value + instead of a dark blue. + ++ Added a "Last-Modified" meta header to modus-themes.el, with gets + updated automatically and uses a timestamp. This helps users who + track the themes' git repo directly. Thanks to Togan Muftuoglu for + the feedback in issue 168: + <https://gitlab.com/protesilaos/modus-themes/-/issues/168>. + ++ Expanded the palette of each theme with accent values that are + reserved for use in the tab-bar. Those are used by the newly + supported 'tab-bar-groups' package. + ++ Recalibrated a few colour combinations to improve their resulting + legibility. The changes should not be noticeable to the untrained + eye. Interested parties can consult commit 349ea4a943. + ++ Tweaked the hueness of the 'yellow-active' colour of 'modus-operandi'. + +Thanks once again to everyone involved! +#+end_src + +* 1.2.0 +:PROPERTIES: +:CUSTOM_ID: h:751083a7-3514-40f5-9928-17a11de5b439 +:END: + +#+begin_src text +Modus themes version 1.2.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2021-03-04 + +This entry records the changes introduced to the project since the +publication of version 1.1.0 (2021-01-24). There have been close to 100 +commits in the meantime. + +Every colour-related modification documented herein conforms with the +overarching accessibility objective of the themes for a minimum contrast +ratio of 7:1 between background and foreground values in their given +combination (the WCAG AAA standard). + +As the official manual is referenced several times throughout this log, +make sure to store its URL: <https://protesilaos.com/emacs/modus-themes>. Or +read it from Emacs' Info reader by evaluating this form: + + (info "(modus-themes) Top") + +If you are coming from older versions, please consult the change log +entry for version 1.0.0 with regard to the breaking changes that were +introduced. + + +Prior notice: Upgrading the themes in Emacs28 and GNU ELPA +---------------------------------------------------------- + +Emacs28, the current development target, now includes a 'require-theme' +function. It is a prerequisite to upgrading the Modus themes to their +current version. Prior to the definition of that function, the themes +could not transition from their 0.13.0 version to >=1.0.0. Special +thanks to Basil L. Contovounesios for making it happen, as well Mauro +Aranda and Eli Zaretskii for their feedback and support. + +Expect the Modus themes in upstream Emacs to be updated shortly after +the publication of this document. + +GNU ELPA currently ships version 0.12.0 of the two standalone packages +'modus-operandi-theme' and 'modus-vivendi-theme'. This will change in +the immediate future, as a new 'modus-themes' package will succeed them. +That new package will be built directly from emacs.git, as it must now +become a ':core' entity instead of being listed as an ':external' one. + +Again, expect a patch to be applied to elpa.git shortly after this +document goes live. + + +Customisation options +--------------------- + +[ All variables and their values are documented in the themes' manual. + The default value is always nil. ] + ++ The new boolean 'modus-themes-subtle-line-numbers' variable will make + the effect of 'display-line-numbers-mode' more subtle when set to a + non-nil value. It removes the underlying background of the unfocused + lines while toning down their foreground. + ++ The 'modus-themes-diffs' variable now accepts a 'deuteranopia' value. + This optimises for red-green colour deficiency in all modes that show + diffs (diff-mode, ediff, Magit...). In practice, all instances of + green are replaced with appropriate blue hues. For more on the + matter, read the report which also includes pictures: + <https://protesilaos.com/codelog/2021-02-25-modus-themes-diffs-deuteranopia/>. + ++ The 'modus-themes-syntax' variable now reads 'faint-yellow-comments' + as a valid value. This has the same scope as the existing 'faint' + value with the added effect of assigning a yellow tint to comments: it + tones down the saturation of colours that apply to code syntax + (standard font-lock faces and others inheriting from them). + ++ The 'modus-themes-links' variable is expanded to accept the new value + of 'neutral-underline-only': it removes the foreground from the link + and draws a neutral gray underline below it. + + +Refinements to existing packages or face groups +----------------------------------------------- + ++ Refashioned all faces that pertain to emails, including Gnus, Mu4e, + Notmuch, and the standard 'message.el' library. This concerns the + colours that apply to the message header keys and their values, as + well as quote levels. + + - Introduced more contrasting hues for headings and made more + considerate use of bold typography. The new colour combinations are + better suited for the task of delivering a sense of structure; + structure that is at once effective and subtle. + + - Applied less intense colours throughout all quotation levels. + + - Revised the sequencing of hues in quotation levels to allow distinct + levels to stand out more without relying on excessive saturation. + + - Aligned the styling of Notmuch header dates with their counterparts + in other similar contexts, in pursuit of theme-wide consistency. + ++ Rewrote the faces of EBDB to achieve a better sense of structure. + ++ Refined the colour combinations of change-log and log-view buffers to + make it easier to discern distinct elements. + ++ Tweaked the colours of certain Elfeed constructs to improve the + overall presentation of its search buffers. + ++ Changed the colour combinations of 'M-x re-builder' to amplify the + distinction between the matching regexp groups while still reducing + their overall intensity. + ++ Reconfigured the 'diff-changed' face to always extend its background + to the edge of the window. Such "changed" lines are visible in + 'diff-mode' buffers when the command 'diff-unified->context' is + invoked. + ++ Tweaked the colour combinations of ancillary faces in diff buffers + when the variable 'modus-themes-diffs' is set to the value 'fg-only'. + In particular: + + - Removed the subtle background from the diff hunk headings and changed + their colour to ensure good visibility---guarantees a sense of + structure. + + - Made the context lines inherit the default foreground colour (pure + black/white), so that it contrasts better with red, green, and + yellow text. + + - Applied an accented foreground to the diff header. This is to + ensure that it is not mistaken for a diff hunk's context. + + All these guarantee that the foreground-only highlights in line-wise + differences draw more attention to themselves. + ++ Aligned all the standard hi-* faces with their default aesthetics. + Those are used by commands such as 'highlight-symbol-at-point'. + Thanks to Philip K. for the valuable feedback in issue 157: + <https://gitlab.com/protesilaos/modus-themes/-/issues/157>. + ++ Removed obsolete Consult faces and added new ones, so as to remain in + sync with the latest developments in that project. Thanks to Daniel + Mendler (Consult's maintainer) for reporting the inconsistency in + issue 155: <https://gitlab.com/protesilaos/modus-themes/-/issues/155>. + + - 'consult-preview-line' now retains fontification on the current + line, instead of applying its own foreground. + + - 'consult-narrow-indicator' is refashioned to be colour-coded in a + consistent way with 'consult-async-split', as both denote the + delineation of a given scope. + + - 'consult-imenu-prefix' contrasts better with text on its current + line, while it adapts to possible customisations performed on the + Consult front. + ++ Expanded the coverage of 'marginalia' faces to two include + 'marginalia-char' and 'marginalia-type'. This is done in the interest + of internal consistency between the elements of this set, as their + defaults were also accessible (they inherit from standard faces that + we already support). + ++ Opted to render the Notmuch logo in a neutral gray backdrop. This was + deemed necessary as the logo is an immutable image file that consists + of black and white strokes. Black and white are the main background + values of 'modus-vivendi' and 'modus-operandi' respectively, which + could lead to confusion. The neutral gray ensures that the logo is + visible at all times. Thanks to Utkarsh Singh for the feedback in + issue 122: <https://gitlab.com/protesilaos/modus-themes/-/issues/122>. + ++ Refined the dedicated colour values used for diff hunk headings, as + seen in diff-mode buffers or Magit. The new colours yield text that + is easier to read by slightly toning down the combined intensity of + background+foreground. + ++ Removed the subtle background of 'diff-header' and 'diff-file-header'. + The header's foreground and textual representation suffice to render + it distinct in its context. + ++ Tweaked 'org-agenda-structure' and 'org-scheduled' to enhance the + usability of Org Agenda buffers. + + - Made 'org-agenda-structure' use the largest possible height that we + expose to users: 'modus-themes-scale-5'. + + - Re-calibrated the hueness of 'org-scheduled' and amplified its + saturation, in order to better convey the meaning of a scheduled + task. + + Thanks to Morgan Smith for the valuable feedback in issue 153: + <https://gitlab.com/protesilaos/modus-themes/-/issues/153>. + ++ Tweaked the faces of the 'bongo' package to enhance the + distinctiveness of the constructs they style. + ++ Adjusted the overall aesthetic of calendar faces in the interest of + theme-wide consistency. + ++ Aligned the visual metaphors of 'org-code' with those of 'org-macro' + and 'org-verbatim', by ensuring that a subtle background is present + behind the affected text, while the foreground conforms with the norms + of the 'modus-themes-no-mixed-fonts' customisation option. + ++ Made quoted text in Info buffers look the same as 'org-verbatim' and + Markdown's inline code. + ++ Instructed the faces of 'info-colors' to inherit from appropriate + font-lock faces. This guarantees that everything works as intended + with the various values of 'modus-themes-syntax'. + ++ Refined the language tag of Markdown fenced blocks so that it does + attract unwarranted attention while delivering on its intended + purpose. + ++ Rendered explicit the slant of ace-window hints, guaranteeing that it + does not inherit from the underlying text. Thanks to Nicolas De + Jaeghere for the patch: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/27>. + + [ Some more changes have been discussed, but those require tweaks to + the upstream package. ] + ++ Ensured that the 'org-tree-slide-header-overlay-face' never draws an + overline when the variable 'modus-themes-headings' includes a relevant + setting for heading level 1. Such as with the following example (all + customisation options are documented in the themes' manual): + + (setq modus-themes-headings + '((1 . section) + ...)) + ++ Extended support for the new 'tab-line-tab-inactive-alternate' face as + that occurs in Emacs28 (current development target). It comes into + effect when the variable 'tab-line-tab-face-functions' includes a + value of 'tab-line-tab-face-inactive-alternating'. + + +Newly supported packages +------------------------ + ++ bbdb :: Thanks to Nicolas De Jaeghere in issue 128: + <https://gitlab.com/protesilaos/modus-themes/-/issues/128>. + ++ mmm-mode :: Thanks to Davor Rotim for the feedback in issue 161: + <https://gitlab.com/protesilaos/modus-themes/-/issues/161>. + ++ quick-peek :: Thanks to Burgess Chang for the feedback in issue 151: + <https://gitlab.com/protesilaos/modus-themes/-/issues/151> + ++ selectrum-prescient :: This new package was brought to my attention by + Manuel Uberti. The intent is to phase out the faces in Selectrum, + namely 'selectrum-primary-highlight', 'selectrum-secondary-highlight', + though those will still be supported by the Modus themes for the + foreseeable future. + ++ shortdoc + ++ spray + ++ terraform-mode :: Thanks to Kevin Fleming for the feedback in issue + 159: <https://gitlab.com/protesilaos/modus-themes/-/issues/159>. + ++ vc-dir (Emacs28) + + +Theme-related contributions to the wider community +-------------------------------------------------- + ++ Contributed the faces for 'vc-dir' in Emacs28 and applied them to all + VC backends: <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=46358> and + <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=46745>. + ++ Contributed a new face and some related tweaks to Emacs' + 'shortdoc.el': <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=46748>. + ++ Added faces to the 'tab-bar-echo-area.el' package: + <https://github.com/fritzgrabo/tab-bar-echo-area/pull/2>. + ++ Reported issue that led to the review of the header face in + 'org-tree-slide': <https://github.com/takaxp/org-tree-slide/issues/38>. + ++ Helped refine the faces of the 'rlist.el' package: + <https://gitlab.com/mmemmew/rlist/-/commit/386f506d0110bebedd3a48ff972adba96e2232eb>. + + +Documentation updates +--------------------- + ++ Wrote about the indirect support for the 'goggles' package. I had + helped write its faces, as was documented in the changelog for version + 1.1.0 of the themes. Thanks to Manuel Uberti for bringing this to my + attention in issue 158: + <https://gitlab.com/protesilaos/modus-themes/-/issues/158>. + ++ Explained that any changes to 'custom-theme-load-path' and/or + 'custom-theme-directory' should be performed before the themes are + loaded. Thanks to Adrian Manea for the feedback in issue 156: + <https://gitlab.com/protesilaos/modus-themes/-/issues/156>. + ++ Included the symbol 'bg-only' in the 'modus-themes-diffs' section of + the manual. Thanks to user "iSeeU" for reporting the omission: + <https://gitlab.com/protesilaos/modus-themes/-/issues/154>. + ++ Expanded the manual's entry on the semantics of the optional heading + scale used by the themes (the variables 'modus-themes-scale-[1-5]'). + The values 1-4 apply to regular headings, with 4 being the largest on + the scale. While 'modus-themes-scale-5' is reserved for special + headers, such as Org '#+title:' or the Org Agenda's structure. Recall + that those variables only come into effect if the boolean variable + 'modus-themes-scale-headings' is set to a non-nil value (it is nil by + default). + ++ Made several changes to the 'modus-themes.org' file in an effort to + improve the accuracy of the generated Texinfo markup. Thanks to Glenn + Morris and Richard Stallman for their valuable feedback in + <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=45143>. + ++ Recorded a note in the manual on the intended colouration of + backgrounds applied by 'mmm-mode'. It explains what the constraints + are from an accessibility standpoint and how users can configure + things locally for more colourful, yet inaccessible, backgrounds. + Thanks to Davor Rotim for the valuable feedback in issue 161: + <https://gitlab.com/protesilaos/modus-themes/-/issues/161>. + ++ Refined the manual's note on prism.el, simplifying the code samples + and clarifying the commentary. + ++ Wrote indices for concepts, variables, functions, which are rendered + in the Info manual. + ++ Elaborated on the possibility---and relative merits---of implementing + a theme-agnostic hook for advanced face configurations, as opposed to + relying on 'modus-themes-after-load-theme-hook'. Thanks to Daniel + Mendler for the valuable feedback in issue 131: + <https://gitlab.com/protesilaos/modus-themes/-/issues/131>. + + +Miscellaneous +------------- + ++ Rewrote the documentation string of the 'deftheme' declaration of + 'modus-operandi' and 'modus-vivendi'. + ++ Provided links to the Info nodes that discuss each of the 'defcustom' + declarations. + ++ Wrote doc strings for every custom face that the themes define. +#+end_src + + +* 1.1.0 +:PROPERTIES: +:CUSTOM_ID: h:bb0e16a9-8a8b-4b1b-9d62-b1715295247b +:END: + +#+begin_src text +Modus themes version 1.1.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2021-01-24 + +This entry records the changes introduced to the project since the +publication of version 1.0.0 (2020-12-05). There have been around 150 +commits in the meantime, qualifying this as one of the largest releases +to date. + +As always, every colour-related modification documented herein conforms +with the overarching accessibility objective of the themes for a minimum +contrast ratio of 7:1 between background and foreground values in their +given combination (conformance with the WCAG AAA standard). + +As the official manual is referenced several times, make sure to store +its URL: <https://protesilaos.com/emacs/modus-themes>. + +If you are coming from older versions, please consult the change log +entry for version 1.0.0. + + +Overview +-------- + ++ We have brought back the options that were present in version 0.13.0 + or earlier which allowed users to override colors for either---or + both---of Modus Operandi and Modus Vivendi. Compared to the old + mechanism, the new one is more robust and should work regardless of + whether users run byte compiled code or not. This is considered and + advanced, "do-it-yourself" pathway to theme customisation. It is + discussed at length in the manual. + ++ The new 'modus-themes-with-colors' macro makes it possible to read + palette variables from the active theme and, thus, pass them to + arbitrary functions or variables. Again, this is part of the advanced + customisations that are covered in the manual. + ++ Several of the existing customisation options provide new stylistic + variants, further expanding their utility. While there are some new + customisations altogether. Combined with the above, we provide the + infrastructure that allows the themes to adapt gracefully to a variety + of circumstances and cover a broad range of demands. + ++ More packages are added to the already comprehensive list of supported + face groups. + ++ Some of the supported faces have benefited from further, albeit + subtle, refinements, demonstrating our commitment to consistency as + well as our attention to detail. + ++ Two reports on such "further refinements" were published on the code + log section of protesilaos.com: <https://protesilaos.com/codelog>. + ++ We have more people contributing to the project (and assigning + copyright to the FSF---as the themes are part of Emacs) and newer + users reporting issues. Also, there is anecdotal evidence from + several sources on an increased interest to make new or existing faces + accessible by default (such as by copying colour combinations from the + themes). + + +New customisation options +------------------------- + ++ The existing 'modus-themes-mode-line' variable now supports three new + borderless styles: 'borderless', 'borderless-3d', 'borderless-moody'. + + - The 'borderless' value uses the same colors as the default (nil + value), but removes the border effect. This is done by making the + box property use the same color as the background, effectively + blending the two and creating some padding. + + - The 'borderless-3d' and 'borderless-moody' approximate the '3d' and + 'moody' options respectively, while removing the borders. However, + to ensure that the inactive modelines remain visible, they apply a + slightly more prominent background to them than what their + counterparts do (same inactive background as with the default). + + The complete list of options: + + 1. nil (default) + 2. 3d + 3. moody + 4. borderless + 5. borderless-3d + 6. borderless-moody + ++ 'modus-themes-lang-checkers' provides several styles for spell + checkers and code linters with regard to how they underline text. The + default (nil) is to use a colour-coded wavy underline, without + changing the foreground of the affected text. Other options include + the ability to set a straight underline and to control the saturation + of the foreground, while one also provides for a change in the + background of the text in question. The valid symbols are as follows + (read the manual for more on the matter): + + 1. nil (default) + 2. straight-underline + 3. subtle-foreground + 4. subtle-foreground-straight-underline + 5. intense-foreground + 6. intense-foreground-straight-underline + 7. colored-background + ++ The 'modus-themes-org-habit' lets users pick between three styles for + the 'org-habit' table: (1) nil (the default), which uses a total of + eight colours, (2) 'simplified' which reduces the effective colours to + four, while applying less saturated hues, and (3) 'traffic-light' + which bring the colour count to three, thus blending the "clear" and + "ready" states for workflows where the distinction between is not + useful. + + Please read the manual for a more detailed description of those + variants. + + Thanks to Gustavo Barros for suggesting the idea, providing user + feedback on stylistic choices, as well as sharing insights on the + workflow that made the 'traffic-light' style possible: + <https://gitlab.com/protesilaos/modus-themes/-/issues/135>. + ++ 'modus-themes-variable-pitch-ui' when set to a non-nil value applies a + proportionately spaced typeface (controlled by the 'variable-pitch' + face) to the User Interface, specifically the mode line, header line, + and tab-{bar,line}. + ++ The existing 'modus-themes-links' variable now has a colourless + stylistic alternative: 'underline-only'. The available styles: + + 1. nil (default) + 2. faint + 3. neutral-underline + 4. faint-neutral-underline + 5. no-underline + 6. underline-only + ++ The existing 'modus-themes-prompts' variable has two new grayscale + styles: 'subtle-gray', 'intense-gray'. Furthermore, their old + 'subtle' and 'intense' values have more informative aliases in the + form of 'subtle-accented' and 'intense-accented'. All available + values: + + 1. nil (default) + 2. subtle-accented ('subtle' remains for backward-compatibility) + 3. intense-accented ('intense' remains for backward-compatibility) + 4. subtle-gray + 5. intense-gray + ++ The existing 'modus-themes-headings' variable now accepts two new + styles: 'no-color', 'no-color-no-bold'. All stylistic variants: + + 1. nil (default fallback option---covers all heading levels) + 2. t (default style for a single heading, when the fallback differs) + 3. no-bold + 4. line + 5. line-no-bold + 6. rainbow + 7. rainbow-line + 8. rainbow-line-no-bold + 9. highlight + 10. highlight-no-bold + 11. rainbow-highlight + 12. rainbow-highlight-no-bold + 13. section + 14. section-no-bold + 15. rainbow-section + 16. rainbow-section-no-bold + 17. no-color + 18. no-color-no-bold + + Please read the manual for instructions on how to apply those + universally or on a per-level basis. + + +Added support for packages +-------------------------- + ++ cfrs (used by treemacs) ++ cperl-mode ++ diredc + ++ display-fill-column-indicator-mode. Thanks to Gustavo Barros for the + feedback: <https://gitlab.com/protesilaos/modus-themes/-/issues/148>. + ++ evil-snipe. Thanks to Peter Wu for the feedback: + <https://gitlab.com/protesilaos/modus-themes/-/issues/139>. + ++ isl (isearch-light). Thanks to Manuel Uberti for the feedback: + <https://gitlab.com/protesilaos/modus-themes/-/issues/144>. + ++ marginalia ++ org-tree-slide ++ recursion-indicator + ++ solaire. Thanks to CsBigDataHub1 for the feedback: + <https://gitlab.com/protesilaos/modus-themes/-/issues/137>. + + +Refinements to already supported faces +-------------------------------------- + ++ Reviewed the 'rainbow-delimiters' faces. Everything is documented in + a separate report (with screenshots). The short version is that we + pay close attention to detail and are willing to go to great lengths + in pursuit of improving the overall user experience: + <https://protesilaos.com/codelog/2020-12-27-modus-themes-review-rainbow-delimiters/>. + ++ Updated the dedicated colours for 'whitespace-mode'. The background + should now be easier to discern. Also removed any remaining + inconsistencies. Thanks to Toon Claes for the feedback: + <https://gitlab.com/protesilaos/modus-themes/-/issues/149>. + ++ Refined the faces of regexp constructs for strings affected by certain + values passed to the 'modus-themes-syntax' option. This is done to + disambiguate the backslashes and grouping delimiters from the rest of + the string. The relevant values for 'modus-themes-syntax' are: + + - green-strings + - yellow-comments-green-strings + - alt-syntax + - alt-syntax-yellow-comments + + The default colour for strings is blue, while regexp faces are yellow + and red, whereas in those variants the strings become green, hence the + need to make regexp faces more distinct (blue and magenta contrast + better with green and also between themselves, thus matching the + alternative aesthetics). + ++ Reviewed dictionary.el faces (which ships with Emacs 28): + + - Made 'dictionary-reference-face' look like all other links. + + - Removed all properties from 'dictionary-word-definition-face': + the default sets a font family, which can create inconsistencies. + + - Converted 'dictionary-word-entry-face' into comment-like text. + ++ Refined and expanded the faces of Consult. + + - Made its grep commands look the same as those of all other grep + tools. + + - Ensured that line number previews, such as for the 'consult-line' + command use their own style of a subtle foreground instead of + inheriting from the 'line-number' face. This is to avoid cases + where previewed numbers and actual line numbers could be conflated + for one another. + + - Removed the foreground pertinent to 'consult-imenu-prefix', as its + bold weight combined with the structure of Imenu indices was deemed + sufficient to differentiate it from actual 'consult-imenu' targets. + ++ Eliminated exaggerations in the use of colour for various 'which-key' + faces. + ++ Removed the needless background from the 'log-view-commit-body' face. + This is a new face that ships with Emacs 28 (its inclusion upstream + was documented in the last changelog entry). + ++ Applied a subtle background to the 'log-view-message' face, in the + interest of improving the usability of its interface, in particular, + to contribute to heightened situational awareness while invoking + 'log-view-toggle-entry-display' in buffers such as those produced by + 'vc-print-root-log'. + ++ Introduced a neutral background for all 'outline-minor-faces' instead + of merely mirroring the style of 'outline-mode' headings. This is + because it can sometimes be hard to tell whether 'outline-minor-mode' + is active, provided certain fairly common configurations in the + 'modus-themes-headings' user option (refer to the manual for all + customisation options). + ++ Tweaked 'diff-mode' headings. + + - Adjusted the values of the dedicated colours for diff headings in + order to amplify their relative contrast. + + - Assigned a bold typographic weight to the 'diff-hunk-header' face so + as to enforce a greater sense of structure. + + - Instructed 'diff-function' to inherit 'modus-theme-diff-heading' in + order to eliminate exaggerations in colouration. + ++ Removed unnecessary underline from 'selectrum-current-candidate'. + Thanks to Daniel Mendler for the feedback: + <https://gitlab.com/protesilaos/modus-themes/-/issues/132>. + ++ Made 'counsel-outline' inherit from the underlying Org faces. Also + corrected the style of 'counsel-outline-default' to use the main + foreground colour. Thanks to Gustavo Barros for the feedback: + <https://gitlab.com/protesilaos/modus-themes/-/issues/134>. + ++ Prevented headings, ultimately governed by the 'modus-themes-headings' + user option, from inheriting the 'default' face as that could lead to + unintended consequences, such as by retaining a background colour when + none was expected. + ++ Refashioned all faces that specified a foreground value of 'fg-alt' to + inherit the 'shadow' face instead ('fg-alt' is the colour that is + used, for example, in code comments by default). This makes it + possible for users to enact change across the theme just by tweaking + 'shadow'. + ++ Fixed 'ruler-mode' text scaling adjustment, to make it cope well with + 'text-scale-adjust' and relevant commands. Also introduced minor + stylistic changes to the remainder of the 'ruler-mode' faces. + ++ Eliminated the potentially problematic form of ':foreground nil' from + the 'org-ellipsis' face. In such cases it is always better to either + specify no foreground whatsoever, or declare an unspecified value. + + +Patches from the community +-------------------------- + +Remember that the themes are part of Emacs and, thus, contributions that +exceed a cumulative total of ~15 lines require the assignment of +copyright to the Free Software Foundation. Please consult the themes' +manual on the matter. + ++ Nicolas De Jaeghere added support for 'exwm-floating-border-color': + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/15>. + ++ Anders Johansson added support for 'helm-fd-finish': + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/16>. + ++ Carlo Zancanaro fixed misquoting of 'tuareg-font-lock-multistage-face': + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/17>. + ++ Xinglu Chen expanded Notmuch support to all its remaining faces: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/18>. + ++ Kostadin Ninev added support for Dired+: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/19>. + ++ Nicolas De Jaeghere expanded the supported items of 'pdf-faces'. Also + added an entry to the manual pertaining to link hints and the + requisite setup: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/20>. + ++ Nicolas De Jaeghere wrote the new 'modus-themes-with-colors' macro, + which is documented at length in the manual: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/21>. + ++ Nicolas De Jaeghere set up the infrastructure that grants users the + ability to override palette colors; an option that was removed in the + transition from version 0.13.0 to 1.0.0. The relevant variables are + 'modus-themes-colors-operandi', 'modus-themes-colors-vivendi' (again, + consult the manual): + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/23>. + ++ Nicolas De Jaeghere deleted the 'modus-themes-core.el' file and merged + its contents into the main 'modus-themes.el' library: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/24> and + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/25>. + ++ Nicolas De Jaeghere made the 'compilation-info' face consistent with + other compilation faces in terms of their optional bold weight: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/26>. + +Any remaining faults that may exist, despite our best intentions to +remove them, are those of the maintainer and will be addressed as soon +as they are identified. + +FSF copyright status: + +| Full name | Copyright | +|---------------------+--------------| +| Anders Johansson | covered | +| Carlo Zancanaro | not required | +| Kostadin Ninev | covered | +| Nicolas De Jaeghere | covered | +| Xinglu Chen | not required | + + +Theme-related contributions to the wider community +-------------------------------------------------- + ++ Helped address an incomplete colour value in 'org-transclusion-block': + <https://github.com/nobiot/org-transclusion/issues/41>. + ++ Contributed to the formation of the zebra striping of 'embark': + <https://github.com/oantolin/embark/commit/bb4ae2a666ab1f4a307edd71f77bcbb90fb25cef>. + ++ Reviewed the faces of 'goggles': + <https://github.com/minad/goggles/commit/d6e584a2c9487d3df4aee818c43485e437cb87ef>. + ++ Helped raise awareness about refactoring 'org-tree-slide-header-overlay-face': + <https://github.com/takaxp/org-tree-slide/issues/38>. + ++ Reported an issue for Moody that would affect the subset of Emacs 28 + users who enable the new 'mode-line-compact' option: + <https://github.com/tarsius/moody/issues/28>. + ++ Did the same for Keycast: <https://github.com/tarsius/keycast/issues/13>. + ++ Defined the new 'perl-non-scalar-variable' in upstream Emacs: + <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=45840>. + + +Miscellaneous +------------- + ++ Created a new palette subset for "graph" colours, as none of the + existing paradigms would suffice for cases where faithfulness to + colour huenesss is important. Those are currently used by + 'modus-themes-org-habit'. + ++ Ensured that theme functions which need to produce an error message do + so by calling 'error' instead of 'user-error'. + ++ Added a 'modus-themes-load-themes' function that users can add to + their init files. + ++ Expanded the project's git repo README file with a sample + 'use-package' configuration. + ++ The previous two points followed from an inquiry into the subtleties + between 'enable-theme' and 'load-theme'. Those are now documented at + length in the manual. + ++ Added screenshots to the web page that holds the official manual. + Thanks to Damien Cassou for the feedback: + <https://gitlab.com/protesilaos/modus-themes/-/issues/147>. + ++ Swapped the values of 'cyan-faint' and 'cyan-alt-faint' for Modus + Vivendi. + ++ Tweaked 'font-lock-doc-face' and 'font-lock-type-face' variations when + "faint syntax" is in effect: (setq modus-themes-syntax 'faint). + ++ Refined 'font-lock-doc-face' for when modus-themes-syntax is given a + value of either 'yellow-comments-green-strings' or 'green-strings'. + The changes are minor when treated in isolation, though they have + helped improve the overall consistency of the end result: the gestalt. + ++ Reviewed select "faint" colours for both Modus Operandi and Modus + Vivendi. The technicalities are discussed in a complete report: + <https://protesilaos.com/codelog/2021-01-11-modus-themes-review-select-faint-colours/>. + ++ Ensured that (setq modus-themes-syntax 'alt-syntax) and its "yellow + comments" variant are more truthful to their intended style, by + eliminating any exaggerations in the use of colour. + ++ Adjusted the saturation of the green-alt value of Modus Vivendi. + ++ Updated the manual to reflect all of the aforementioned. + +Thanks once again to everyone who contributed patches or reported an +issue. This has been yet another period of intense work; work which +helps solidify the Modus themes as (i) uncompromisingly accessible in +accordance with the highest legibility standard, (ii) highly +customisable in true Emacs fashion, (iii) thoroughly comprehensive in +terms of face coverage, and (iv) meticulously designed throughout. +#+end_src + +* 1.0.0 +:PROPERTIES: +:CUSTOM_ID: h:94b5915e-1085-4859-ac9f-daf91e007741 +:END: + +#+begin_src text +Modus themes version 1.0.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2020-12-05 + +This entry documents the changes since version 0.13.0 (2020-10-08). +They constitute a major release with backward-incompatible additions +which are described below. + +As always, every colour-related modification documented herein conforms +with the overarching accessibility objective of the themes for a minimum +contrast ratio of 7:1 between background and foreground values in their +given combination (conformance with the WCAG AAA standard). + +Expect to find examples of basic and advanced customisations in the +comprehensive Info manual bundled with the themes, which is also +available at: <https://protesilaos.com/emacs/modus-themes>. + + +Overview of major changes +========================= + +0. The option that was present in earlier releases to override the + colour palette has been removed. It cannot work with byte + compilation. We must not compromise on performance, especially in + light of the fairly high line count of the themes (broad face + coverage combined with a multitude of customisation options). + +1. The code base has been refactored. The two themes, Modus Operandi + (light) and Modus Vivendi (dark), derive from the same source. + +2. The refactoring makes it possible to distribute the two themes as + part of a single package. You can find 'modus-themes' on MELPA, with + other archives and core Emacs following suit soon thereafter (the + Modus themes are built into Emacs since their version 0.12.0). + +3. The 'modus-operandi-theme' and 'modus-vivendi-theme' packages in + MELPA and GNU ELPA are obsolete. MELPA has already deleted them and + now only provides 'modus-themes', while GNU ELPA shall do so soon + enough. + + + Package providers of GNU/Linux distros, or other archives, are + encouraged to update their sources so that they only deliver a + single package that covers both themes. + +4. To avoid surprises, the refactored code is in the 'main' branch which + becomes the default henceforth. The 'master' branch, from where all + prior releases were built, is thus deprecated. Existing installs of + 'modus-operandi-theme' and/or 'modus-vivendi-theme' must manually + switch to the new package sources, which offer a certain guarantee + that they are informed of the breaking changes documented herein. + + + Users of 'straight.el' must make sure that they pull from the + 'main' branch. This may also be the case for other such tools, + though I have not had the time to test them all. + +5. The refactoring introduces a unified customisation framework. Now + all user-facing variables are named 'modus-themes-*' instead of + 'modus-operandi-*' and 'modus-vivendi-*'. Users of both items can + thus cut down on duplicate code or inelegant workarounds on their + end. Example: + + modus-operandi-bold-constructs + | | | | | | | ====> modus-themes-bold-constructs + modus-vivendi-bold-constructs + +6. The themes now provide common user-facing functions. + + + 'modus-themes-load-operandi' and 'modus-themes-load-vivendi' can be + used in Lisp to load the theme they name, while disabling their + counterpart and running 'modus-themes-after-load-theme-hook'. The + hook can be used to override or further customise faces (examples + are furnished in the manual). + + + 'modus-themes-toggle' interactively switches between Modus Operandi + and Modus Vivendi or opens a minibuffer prompt to select between + the two if none of them is active. It ultimately calls the + aforementioned functions to load the themes, so it also triggers + the hook. Bind this command to a key of your convenience (the + author uses F5). + + + 'modus-themes-color' returns the colour value of a symbol in the + alists that hold the themes' palettes. The alists are + 'modus-themes-colors-operandi' and 'modus-themes-colors-vivendi'. + 'modus-themes-color' always operates on the active theme, making it + suitable for post-theme-load customisations (via the hook we + covered earlier). Its usage is documented in the manual and is + meant to be employed by those who are prepared to assume + responsibility for face-related changes they introduce on their + setup. + + + 'modus-themes-color-alts' occupies the same niche as the one right + above, with the exception that it takes two arguments. The first + is the alist key to be used by 'modus-operandi' and the second is + for 'modus-vivendi'. + + + 'modus-themes-wcag-formula' implements the WCAG formula to measure + a colour value's relative luminance. While 'modus-themes-contrast' + applies the formula to derive the contrast ratio between two colour + values in hexadecimal RGB notation. This can be used to verify the + accessibility of colour combinations provided by the themes or new + ones defined at the user level (the Modus themes conform with the + WCAG AAA standard which means that this kind of contrast is 7:1 or + higher for all applicable background+foreground combinations). + + +Customisation options +===================== + +This is the complete list with all the customisation options: + + modus-themes-slanted-constructs (boolean) + modus-themes-bold-constructs (boolean) + modus-themes-variable-pitch-headings (boolean) + modus-themes-no-mixed-fonts (boolean) + modus-themes-headings (alist) + modus-themes-scale-headings (boolean) + modus-themes-fringes (choice) + modus-themes-org-blocks (choice) + modus-themes-prompts (choice) + modus-themes-mode-line (choice) + modus-themes-diffs (choice) + modus-themes-syntax (choice) + modus-themes-intense-hl-line (boolean) + modus-themes-paren-match (choice) + modus-themes-region (choice) + modus-themes-links (choice) + modus-themes-completions (choice) + +Plus those which are contingent on 'modus-themes-scale-headings': + + modus-themes-scale-1 + modus-themes-scale-2 + modus-themes-scale-3 + modus-themes-scale-4 + modus-themes-scale-5 + +Consult the manual for each of them and please verify that none of the +older options remains in your init file. + + +Customisation options that did not exist in earlier versions +------------------------------------------------------------ + +New entries and their possible values: + +1. modus-themes-syntax + + ,* nil (default) + ,* faint + ,* yellow-comments + ,* green-strings + ,* yellow-comments-green-strings + ,* alt-syntax + ,* alt-syntax-yellow-comments + + (supersedes options for "faint syntax" and "comments") + +2. modus-themes-links + + ,* nil (default) + ,* faint + ,* neutral-underline + ,* faint-neutral-underline + ,* no-underline + + (supersedes options for "no underlines") + +3. modus-themes-paren-match + + ,* nil (default) + ,* intense + ,* subtle-bold + ,* intense-bold + + (supersedes options for "intense paren match") + +4. modus-themes-region + + ,* nil (default) + ,* no-extend + ,* bg-only + ,* bg-only-no-extend + +Furthermore, the 'modus-themes-diff' has a new option to choose from: +the symbol 'bg-only'. It applies colour-coded backgrounds but does not +override any syntax highlighting that may be present. This makes it +suitable for use with a non-nil value for diff-font-lock-syntax (which +is the default for diff-mode buffers in Emacs 27 or higher). + + +Support for new faces or face groups +==================================== + ++ consult ++ macrostep ++ make-mode ++ pdf-tools ++ popup ++ shr ++ sieve-mode + +(remember that the list of supported packages is already comprehensive) + +Thanks to: + ++ Adam Spiers for bringing 'macrostep' to my attention. + ++ Madhavan Krishnan for submitting the code for pdf-tools: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/14>. + ++ Manuel Uberti for reporting the issue with popup.el: + <https://gitlab.com/protesilaos/modus-themes/-/issues/107>. + ++ Again thanks to Manuel for consult: + <https://gitlab.com/protesilaos/modus-themes/-/issues/123>. And to + Daniel Mendler, its developer, for communicating with us on the status + of the project. + ++ Togan Muftuoglu for reporting the issue with sieve-mode: + <https://gitlab.com/protesilaos/modus-themes/-/issues/121>. + + +Refinements to existing faces +============================= + ++ The diary and holiday marks in 'M-x calendar' are displayed using a + slightly tinted background in order to improve their contrast. + Holidays are also rendered in a bold font. Thanks to Nicolas De + Jaeghere for reporting the issue and following it up with valuable + feedback: <https://gitlab.com/protesilaos/modus-themes/-/issues/127>. + ++ Code blocks in 'markdown-mode' now have a subtle background that + extends to the edge of the window. Thanks to Roman Rudakov for the + suggestion and Hörmetjan Yiltiz for further testing: + <https://gitlab.com/protesilaos/modus-themes/-/issues/115>. + ++ Inline code in 'markdown-mode' has a subtle background that covers the + length of the construct. Refer to issue #115 as above. + ++ Ivy's main pattern-matching faces are slightly adjusted to work more + effectively when users opt for "modus-themes-completions 'moderate" or + "modus-themes-completions 'opinionated". + ++ Swiper's 'swiper-isearch' command defaults to a more colourful + presentation that clearly disambiguates matching pattern groups + between themselves as well as their own active and inactive states. + Thanks to John Haman for reporting the problem: + <https://gitlab.com/protesilaos/modus-themes/-/issues/125>. + ++ Swiper's remaining faces are tweaked to better convey the intent of + this tool. + ++ The border of 'ivy-posframe' is more noticeable. Thanks to Pete + Kazmier: <https://gitlab.com/protesilaos/modus-themes/-/issues/126>. + ++ The 'fringe' face no longer returns a nil background, which allows + 'dap-ui-controls-mode' to display things properly. Thanks to Simon + Pugnet: <https://gitlab.com/protesilaos/modus-themes/-/issues/106>. + ++ Tags and priority cookies in Org mode no longer have a box property. + This is because of changes in upstream Org that we helped solve and + that are covered in the previous CHANGELOG entry (in short: Org + heading constructs inherit the underlying heading's properties that + are not part of their own specs, while they retain those that are + explicitly defined for them---adaptive headings). Properly solves the + following issues: + + ,* <https://gitlab.com/protesilaos/modus-themes/-/issues/104>. Thanks + to user "bepolymathe". + + ,* <https://gitlab.com/protesilaos/modus-themes/-/issues/95>. Thanks + to Roman Rudakov. + ++ The faces of 'M-x re-builder' are less intrusive. + ++ All the following now inherit from basic font-lock faces and thus + benefit from options such as 'modus-themes-syntax': + + ,* geiser + ,* nxml-mode + ,* tuareg + ,* web-mode + ,* xah-elisp-mode + ++ Diff headers have a subtle grey background that extends to the edge of + the window. + ++ The faces of log-view and change-log use colour combinations that + better differentiate the various objects on display. + ++ 'font-lock-type-face' uses a cyan hue instead of magenta. + ++ 'magit-header-line-key' uses a blue foreground colour instead of red. + ++ Doc strings in code syntax are rendered in a new dedicated colour. + The change is fairly subtle and should practically go unnoticed. + ++ 'org-date' now respects the 'modus-themes-no-mixed-fonts' option. + Thanks to user "fleimgruber" for reporting the issue: + <https://gitlab.com/protesilaos/modus-themes/-/issues/124>. + ++ 'org-property-value' uses a slightly different shade of cyan. + ++ 'dim-autoload' will always look like a regular comment. + ++ The 'italic' face is inhereted by all relevant faces instead of + hard-wiring a slant property. This offers the potential advantage of + specifying a distinct family (or other properties) for constructs that + are meant to be rendered in italics (the manual has an example in its + DIY sections for this scenario though it uses the 'bold' face---just + apply the same idea to the 'italic' face). + ++ 'dictionary-reference-face' inherits from 'button' (as with all + links). + ++ Several comment-related faces beyond the basic ones work with + 'modus-themes-syntax' when that has an effect on the colour of + comments. The faces are: + + ,* git-commit-comment-file + ,* git-commit-comment-heading + ,* git-rebase-comment-hash + ,* git-rebase-comment-heading + ++ 'transient-value' is more noticeable and fits better in its context. + ++ All remaining Org metadata-related faces are refined for consistency + between them in an attempt to make them unobtrusive. More subtle + colouration is applied. Affected faces: + + ,* org-drawer + ,* org-property-value + ,* org-special-keyword + + +Theme-related contributions to the wider community +================================================== + ++ Defined the 'log-view-commit-body' for Emacs 28.1: + <https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-11/msg00303.html> + and + <https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-11/msg02196.html>. + ++ Specified the version of the 'diff-error' face for Emacs 28.1: + <https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-11/msg01328.html>. + ++ Added the 'org-dispatcher-highlight' face to upstream Org: + <https://lists.gnu.org/archive/html/emacs-orgmode/2020-10/msg00158.html>. + + ,* Report with screenshots: + <https://protesilaos.com/codelog/2020-10-24-org-export-dispatcher-face/>. + ++ Helped fix face of Flymake's unknown backend in inactive modelines: + <https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-11/msg01119.html>. + ++ Solved bug#44198 about a user not knowning the themes are in Emacs: + <https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-10/msg02001.html>. + + +Miscellaneous +============= + ++ The new default 'main' branch of the Modus themes' git repo is an idea + that was presented by user "Emacs Contrib" in issue 112: + <https://gitlab.com/protesilaos/modus-themes/-/issues/112>. Raising + awareness about the negative impact of potentially, tacitly, or + explicitly offensive language is a goal worth pursuing. Plus "main" + is a more appropriate name for the primary branch of a project and we + do not lose anything by introducing this change as part of version + 1.0.0, which anyhow requires manual interventions in user + configurations. + ++ Thanks to Manuel Uberti, Jeremy Friesen, and Gitlab user "Eugene" for + their feedback during the process that eventually led to the + development of the 'modus-themes-syntax' customisation option: + <https://gitlab.com/protesilaos/modus-themes/-/issues/105>. + ++ Thanks to André Alexandre Gomes for the feedback in issue 111, which + led to the simplification of the manual's references to Guix: + <https://gitlab.com/protesilaos/modus-themes/-/issues/111>. + ++ Thanks to Nicolas De Jaeghere for noting that BBDB is indirectly + supported: <https://gitlab.com/protesilaos/modus-themes/-/issues/128>. + +Between the refactoring of the code base and all other changes, this has +been yet another period of hard work to deliver on the promise of themes +that are (i) highly accessible and (ii) comprehensive in both their face +coverage and customisation options, while always conforming with the +highest accessibility standard for legible text. + +Special thanks to the MELPA maintainers for all their contributions. +MELPA is an integral part of the wider Emacs community. Thanks, in +particular, to Chris Rayner who has reviewed all my pull requests +hitherto, and to Jonas Bernoulli for checking the latest one (and its +concomitant issue) that introduced the new 'modus-themes' package. + +Thank you, the reader, for your attention and for understanding the +longer term benefits of the refactoring, despite the short term friction +it may have introduced. +#+end_src + +* 0.13.0 +:PROPERTIES: +:CUSTOM_ID: h:b529ec46-2a9f-4844-9760-4708d2ca575b +:END: + +#+begin_src text +Modus Operandi and Modus Vivendi version 0.13.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2020-10-08 + +This entry documents the changes since version 0.12.0 (2020-08-26). +There have been around 150 commits in the meantime, making this the +largest release to date (though sheer volume should not be conflated +with quality, of which there is plenty). + +As always, everything described herein conforms with the overarching +accessibility objective of the themes for a minimum contrast ratio of +7:1 between background and foreground values in their given combinations +(conformance with the WCAG AAA standard). + +Overview +======== + +1. There is a new Info manual that documents the customisation options + as well as every other piece of information pertinent to the themes. + You will find it in the Info pages inside of Emacs. Or browse it + online: <https://protesilaos.com/emacs/modus-themes>. + +2. New customisation options grant users more power to further adapt the + active theme to their preferences. + +3. Extended coverage for even more faces and face groups, adding to the + already comprehensive list of directly supported ones. + +4. Lots of tweaks to improve the use of colour and avoid exaggerations + (well, "exaggerations" is relative, since the prior state was already + carefully designed). + +5. A new page hosts all pictures that demo the themes across a wide + range of scenaria: <https://protesilaos.com/emacs/modus-themes-pictures>. + +6. Similarly, the change log also has its own dedicated web page: + <https://protesilaos.com/emacs/modus-themes-changelog>. + + +New customisation options +========================= + +Note that all customisation options are documented at length in the new +Info manual. What is offered here is not necessarily exhaustive. + + +Diff styles +----------- + +Symbol names ("choice" type): + ++ modus-operandi-theme-diffs ++ modus-vivendi-theme-diffs + +Possible values: + +1. nil (default) +2. desaturated +2. fg-only + +DEPRECATED ("boolean" type): + ++ modus-operandi-theme-subtle-diffs ++ modus-vivendi-theme-subtle-diffs + +This option supersedes older ones while retaining their functionality. + +The default remains unaltered, meaning that the diffs will use fairly +prominent colour-coded combinations for the various elements (e.g. green +text on an unambiguously green backdrop). + +A 'desatured' value will tone down the default aesthetic, giving a less +vibrant feel. + +While 'fg-only' removes almost all coloured backgrounds, opting to apply +colour only to the relevant text (this was the case with the +now-deprecated options). There are some exceptions, like word-wise or +"refined" diffs, which still use coloured backgrounds to convey their +meaning. + + +Modeline styles +--------------- + +Symbol names ("choice" type): + ++ modus-operandi-theme-mode-line ++ modus-vivendi-theme-mode-line + +Possible values: + +1. nil (default) +2. 3d +3. moody + +DEPRECATED ("boolean" type): + ++ modus-operandi-theme-3d-modeline ++ modus-vivendi-theme-3d-modeline + +The default modeline continues to be a two-dimensional rectangle with a +border around it. Active and inactive modelines use different colour +combinations for their main background and foreground. + +Option '3d' produces an effect similar to what you get in a generic +Emacs session, where the active modeline has a pseudo three-dimensional +effect applied to it. This option offers the same functionality as that +of the deprecated variables. + +Option 'moody' is designed specifically for use with the Moody library, +though it can also be used without it. Instead of implementing a box +effect, it applies an overline and underline instead, while also toning +down the inactive modeline. + +Thanks to Nicolas De Jaeghere for the feedback and code samples in issue +80: <https://gitlab.com/protesilaos/modus-themes/-/issues/80> + + +Headline styles +--------------- + +Symbol names ("alist" type): + ++ modus-operandi-theme-headings ++ modus-vivendi-theme-headings + +DEPRECATED ("boolean" type): + ++ modus-operandi-theme-rainbow-headings ++ modus-operandi-theme-section-headings ++ modus-vivendi-theme-rainbow-headings ++ modus-vivendi-theme-section-headings + +Possible values, which can be specified for each heading level (examples +further below): + +0. nil (default fallback option---covers all heading levels) +1. t (default style for a single heading, when the fallback differs) +2. no-bold +3. line +4. line-no-bold +5. rainbow +6. rainbow-line +7. rainbow-line-no-bold +8. highlight +9. highlight-no-bold +10. rainbow-highlight +11. rainbow-highlight-no-bold +12. section +13. section-no-bold +14. rainbow-section +15. rainbow-section-no-bold + +This supersedes and greatly expands upon what the deprecated variables +once offered. It is now possible to (i) benefit from more stylistic +choices, and (ii) apply them on a per-level basis. + +As always, the defaults remain in tact: headings are just rendered in a +bold weight and their colours are not too saturated to offer a plain +text impression that relies on typography to convey its meaning. + +The info manual explains the details. A few examples: + + ;; Per-level styles (t means everything else) + (setq modus-operandi-theme-headings + '((1 . highlight) + (2 . line) + (t . rainbow-line-no-bold))) + + ;; Uniform style for all levels + (setq modus-operandi-theme-headings + '((t . rainbow-line-no-bold))) + + ;; Default style for level 1, while others differ + (setq modus-operandi-theme-headings + '((1 . t) + (2 . line) + (t . rainbow-line-no-bold))) + +Thanks to Adam Spiers for the feedback in issue 81: +<https://gitlab.com/protesilaos/modus-themes/-/issues/81>. Also thanks +to Nicolas De Jaeghere for helping refine relevant stylistic choices: +<https://gitlab.com/protesilaos/modus-themes/-/issues/90>. + + +No link underlines +------------------ + +Symbol names ("boolean" type): + ++ modus-operandi-theme-no-link-underline ++ modus-vivendi-theme-no-link-underline + +Possible values: + +1. nil (default) +2. t + +By default, the themes apply an underline effect to links, symbolic +links, and buttons. Users can now disable this style by setting the new +option to 't'. + +Thanks to Utkarsh Singh for the feedback in issue 94: +<https://gitlab.com/protesilaos/modus-themes/-/issues/94> + + +No mixed fonts +-------------- + +Symbol names ("boolean" type): + ++ modus-operandi-theme-no-mixed-fonts ++ modus-vivendi-theme-no-mixed-fonts + +Possible values: + +1. nil (default) +2. t + +By default, the themes configure some spacing-sensitive faces, such as +Org tables and code blocks, to always inherit from the 'fixed-pitch' +face (documented in the manual). This is to ensure that those +constructs remain monospaced when users opt for something like the +built-in 'M-x variable-pitch-mode'. Otherwise the layout would break. + +The obvious downside with this theme design is that users need to +explicitly configure the font family of 'fixed-pitch' in order to apply +their desired typeface (how to do this is also covered in the manual). +That may be something they do not want to do. Hence this option to +disable any kind of font mixing done by the active theme. Set it to +'t'. + + +Support for new faces or face groups +==================================== + ++ awesome-tray ++ binder ++ cperl-mode ++ eldoc-highlight-function-argument ++ erc escaped colour sequences ++ eshell-syntax-highlighting ++ flycheck-color-mode-line ++ isearch regexp groups (Emacs version >= 28) ++ mpdel ++ objed ++ org 9.4 new faces: 'org-headline-todo' and 'org-table-header' ++ racket-mode ++ typescript-mode + +Thanks to: + ++ Damien Cassou for reporting the issue with mpdel: + <https://gitlab.com/protesilaos/modus-themes/-/issues/99> + ++ Dario Gjorgjevski for reporting the issue with erc: + <https://gitlab.com/protesilaos/modus-themes/-/issues/92> + ++ Markus Beppler for contributing the patch for cperl-mode: + <https://gitlab.com/protesilaos/modus-themes/-/merge_requests/11> + ++ User "Moesasji" for reporting the issue with objed: + <https://gitlab.com/protesilaos/modus-themes/-/issues/79> + + +Refinements to existing faces +============================= + ++ calfw applies colours and styles in a way that makes it consistent + with the rest of the themes' metaphors. + ++ diredfl makes more considerate use of colour. We still apply colour + everywhere (the whole point of this package) but make sure to avoid + exaggerations. + ++ doom-modeline-battery-error face fits better with the rest of the + design. + ++ elfeed search buffers use less intense colours, while still keeping + all elements fairly distinct. The intent is to avoid a "rainbow + effect" in such a dense interface. + ++ elfeed read and unread items are more distinct. + ++ git commit and vc log edit messages benefit from refined colour + combinations for their various constructs. The commit's summary is + now rendered in a bold weight, to better convey the idea that this is + a quasi heading element. + ++ gnus heading colours are more consistent. All information remains + clearly distinct, but we now avoid using colours that are on opposite + sides of the colour spectrum. Basically to keep things distinct + without going over the top. + ++ gnus read and unread items are easier to tell apart. Thanks to user + "Nick" for reporting the issue: + <https://gitlab.com/protesilaos/modus-themes/-/issues/97>. + ++ help-argument-name has a distinct foreground colour, so that it is + easier to spot it in "*Help*" buffers. Its slant is also controlled + by the active theme's customisation option for slanted constructs (nil + by default---check the manual). + ++ helpful-heading now is consistent with other heading styles. Thanks + to Nicolas De Jaeghere for reporting the issue: + <https://gitlab.com/protesilaos/modus-themes/-/issues/90>. + ++ icomplete, ido, orderless are all tweaked to work better under various + circumstances. + ++ info-menu-star uses a red colour to make it easier to select a menu + entry by estimating its number. This face applies to every third + element and is a nice little extra to have. + ++ info quoted strings are configured to always render in 'fixed-pitch', + in line with the themes' design for mixed fonts (remember to check the + relevant customisation option). + ++ line numbers work properly with 'text-scale-adjust'. Thanks to user + "jixiuf" for reporting the issue: + <https://gitlab.com/protesilaos/modus-themes/-/issues/98>. + ++ line-number-current-line no longer applies a bold weight to its text. + This is to avoid a certain "jump effect" while moving between lines, + where the affected numbers grow and shrink in weight as the line + changes (once you see it, you will know what I mean). + ++ line-number-major-tick and line-number-minor-tick do use a bold weight + because they are fixed on the scale. Their colours are also improved + to better complement their intended role (these faces are for Emacs 27 + or higher). + ++ magit-diff-file-heading-selection, magit-diff-hunk-heading-selection + use more appropriate colour combinations. + ++ markdown blockquotes and org quote blocks use a different foreground, + which is colder than the previous one. Just to make sure that they + are not mistaken for inline code. + ++ message headers use less exaggerated colour combinations. The + differences are fairly minor. + ++ message-mml no longer uses a green foreground, as that could + potentially cause confusion with quoted text in some cases. A unique, + albeit less saturated, foreground is used instead. + ++ message-separator uses a more neutral colour combination, while + retaining its overall uniqueness within its context (i.e. mail + composition). + ++ modeline colours are refined to improve the contrast between active + and inactive states. + ++ mu4e-replied-face has a new colour that accounts for colour distance + relative to its context. Thanks to Shreyas Ragavan for reporting the + issue: <https://gitlab.com/protesilaos/modus-themes/-/issues/69>. + ++ org agenda date and structure no longer behave like headings in other + Org buffers. Instead, they have their own styles to better perform + their intended function and to avoid exaggerations. + ++ org agenda dimmed to-do items (which have blocked sub-items) are no + longer assigned a subtle grey background colour. They are instead + rendered with a bold weight and a subtle grey foreground to minimise + distractions. Thanks to Roman Rudakov for reporting this in issue + 101: <https://gitlab.com/protesilaos/modus-themes/-/issues/101>. + ++ org agenda clocked items are configured to extend their background to + the edge of the window. Otherwise they are cut off at the last text + character, which creates inconsistencies while using tags: a tag is + placed to the right so the background extends further than without + them. Based again on the feedback of Roman Rudakov in issue 101: + <https://gitlab.com/protesilaos/modus-themes/-/issues/101>. + ++ org agenda current time no longer uses a background. A bold weight + and a blue foreground are applied instead. The intent is to keep + things clean. This is also covered by Roman Rudakov's feedback in + issue 101: <https://gitlab.com/protesilaos/modus-themes/-/issues/101>. + ++ org-checkbox-statistics-done, org-checkbox-statistics-todo inherit + from org-done and org-todo respectively, instead of defining their own + properties. + ++ org drawers and their data now use 'fixed-pitch' in the interest of + consistency with other metadata-like faces. Thanks (yet again!) to + Nicolas De Jaeghere for reporting the issue: + <https://gitlab.com/protesilaos/modus-themes/-/issues/91>. + ++ org-footnote underlines will now always use the same colour, instead + of applying the one of other coloured constructs (e.g. when the + footnote is inline and part of the text is rendered as verbatim). + ++ org-meta-line is less prominent and, thus, more consistent with other + metadata-related constructs. + ++ org-roam faces are updated to match the current state of the upstream + project. The main colour of org-roam links is now different than that + of standard links in an attempt to differentiate between the two (due + to their unique semantics). If this is not desired, you can evaluate + the following: + + (setq org-roam-link-use-custom-faces nil) + ++ org-todo, org-done, as well as relevant faces such as priorities and + statistics are reviewed to work better with all heading combinations. + Though please read the next section about "adaptive headings", as such + workarounds will no longer be necessary for future stable releases of + Org. + ++ selectrum uses different styles than before to account for its unique + property of overlaying matching characters on top of the current + line's background. We want to avoid scenaria where matches are + difficult to discern and the current line is not clear. + ++ vc modeline states benefit from improved colour choices. Just minor + adjustments to account for the review of the base modeline colours. + ++ vterm base colours now are variants of gray to ensure that some tools, + such as zsh suggestions work properly. Thanks to user "jixiuf" for + reporting this issue and suggesting a possible solution: + <https://gitlab.com/protesilaos/modus-themes/-/issues/93>. + +Contributions to the wider community +==================================== + +Sometimes the themes reveal bugs in other packages. It is of paramount +importance that we report those to the upstream developers, try to help +them reproduce the issue, and, where possible, support them in tracing +the problem's root cause. + +Four such cases during this release: + +1. Adaptive Org headings. Solved upstream and documented on my website: + <https://protesilaos.com/codelog/2020-09-24-org-headings-adapt/>. + Reported and discussed on the themes' issue tracker: + <https://gitlab.com/protesilaos/modus-themes/-/issues/37>. + +2. Alignment of Org tags with proportional fonts. Ongoing thread: + <https://lists.gnu.org/archive/html/emacs-orgmode/2020-09/msg00415.html>. + Reported and discussed on the themes' issue tracker: + <https://gitlab.com/protesilaos/modus-themes/-/issues/85>. + +3. Org priority cookie has extra space. Ongoing thread: + <https://lists.gnu.org/archive/html/emacs-orgmode/2020-09/msg00696.html>. + Reported and discussed on the themes' issue tracker, with feedback + from Roman Rudakov: + <https://gitlab.com/protesilaos/modus-themes/-/issues/95>. + +4. Company overlay pop-up misaligns items. Reported upstream and + acknowledged as a known issue that occurs in certain cases: + <https://github.com/company-mode/company-mode/issues/1010>. + Discussion on the themes' issue tracker, with feedback from Iris + Garcia: <https://gitlab.com/protesilaos/modus-themes/-/issues/96>. + + +Miscellaneous +============= + ++ Belatedly (by about 2 weeks) pushed tag for version 0.12.0. Thanks to + Alex Griffin for bringing this to my attention: + <https://gitlab.com/protesilaos/modus-themes/-/issues/89> + ++ Fixed a bug with how some older customisation options were declared as + obsolete. Thanks to Tassilo Horn for noticing and reporting the + problem: <https://gitlab.com/protesilaos/modus-themes/-/issues/88>. + ++ Fixed a misplaced optional prefix argument in the manual for how to + switch themes using a custom function. Thanks to Manuel Uberti for + catching this omission of mine and reporting it: + <https://gitlab.com/protesilaos/modus-themes/-/issues/84>. + ++ Silenced the Elisp package linter for a spurious error on a single + eldoc face. Thanks to Steve Purcell for the guidance: + <https://github.com/purcell/package-lint/issues/187>. + ++ Defined two new dedicated background colours for exceptional cases. + These are intended for internal use in very special circumstances. + ++ Reword GuixSD to "Guix System" in the list of package formats + currently available. + ++ Reviewed the main blue colours for both themes. While the changes are + practically impossible to discern upon first sight, the process was + far from straightforward. A complete report documents the minutia: + <https://protesilaos.com/codelog/2020-09-14-modus-themes-review-blues/>. + ++ Reviewed the "active" palette subset, typically used in the modelines. + No report was necessary for those, as the changes were fairly simple. + ++ Reviewed the "intense" background colour that comes into effect when + users opt for the customisation option for intense paren-match styles + (check the manual). Both the hue and the saturation have been changed + to better conform with the intended function of this particular entry. + ++ Reviewed the fringe-specific accented backgrounds. Commit 7316e3320 + contains tables that compare the relative luminance of old and new + values. + ++ Improved the advice for setting fonts using 'set-face-attribute'. The + information is in the manual and is also available as a blog entry: + <https://protesilaos.com/codelog/2020-09-05-emacs-note-mixed-font-heights/>. + ++ Rewrote an expression as "(or x y)" instead of "(if x x y)" in one + place. Just goes to show that tweaking the code is also part of the + deal. + ++ Abstracted and simplified heading level properties by using bespoke + theme faces. Makes it easier to keep things consistent across the + various face groups. + ++ Same principle as above for diff-related styles. + ++ Users who prefer to do things their own way or who just wish to + contribute code to the Modus themes may wish to read my "Notes for + aspiring Emacs theme developers": + <https://protesilaos.com/codelog/2020-08-28-notes-emacs-theme-devs/>. + +This has been yet another period of intense work: reviewing faces and +applying colours is never easy, adding new customisation options is +always tricky, and documenting everything takes a lot of time (unless +you do all of those on a whimsy, which hopefully is not the case here). + +Thanks again to everyone who helped improve the themes! +#+end_src + +* 0.12.0 +:PROPERTIES: +:CUSTOM_ID: h:9d9394c1-84b6-4c23-8936-fe4f2f43301d +:END: + +#+begin_src text +Modus Operandi and Modus Vivendi version 0.12.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2020-08-26 + +This entry documents the set of changes since version 0.11.0 +(2020-07-31). There have been around 70 commits in the meatime, though +the sheer number may obfuscate the fact that a lot of work has gone into +this release. + +As always, every change described here conforms with the accessibility +objective of the themes for a minimum 7:1 contrast ratio between +background and foreground values in their given combinations +(conformance with the WCAG AAA standard). + +New customisation options +========================= + +1 Completion Frameworks +----------------------- + +The star of the show has to be the new option that refashions the +aesthetics of completion UIs: Helm, Icomplete, Ido, Ivy, Sallet, +Selectrum. The 'modus-operandi-theme-completions' and +'modus-vivendi-theme-completions' accept the following symbols: + ++ nil (default) ++ moderate ++ opinionated + +Nil means that the overall presentation of the UI follows the patterns +established by its own source code. For example, Ivy uses four distinct +background and foreground combinations of accented colours to highlight +the matching groups. A grey background is added to denote the implicit +match between those groups. So we choose to respect this metaphor, +while applying colours that conform with the accessibility goal of our +project. Whereas Icomplete or Ido use subtle styles to present their +results. Again, we remain faithful to their presentation. + +With 'moderate', we apply nuanced background and foreground combinations +of accented colour values. This will slightly tone down Helm, Ivy, +Sallet, Selectrum, while it will slightly adjust the looks of Icomplete +and Ido. + +Whereas 'opinionated' has a more pronounced effect on the overall +aesthetics of the UI. For the likes of Icomplete and Ido which are +subtle by default, this option will use intense combinations of +background and foreground colours. They are the diametric opposite of +the nil value. Whereas Helm, Ivy, Sallet, Selectrum, will use even more +subtle colours. Again, they are farther away than their default looks. + +These new options supersede the now-deprecated and more limited in scope +variables of prior releases: + ++ modus-operandi-theme-intense-standard-completions ++ modus-vivendi-theme-intense-standard-completions + +Thanks to the following people for their valuable feedback in issue 75: +https://gitlab.com/protesilaos/modus-themes/-/issues/75 + ++ Anders Johansson ++ Manuel Uberti ++ Shreyas Ragavan + +2 Prompts +--------- + +The 'modus-operandi-theme-prompts' and modus-vivendi-theme-prompts' will +change the overall looks of minibuffer and shell prompts ('M-x shell' as +well as 'M-x eshell'). Their possible values are: + ++ nil (default) ++ subtle ++ intense + +Nil will only use a coloured foreground for the prompts' text. Simple +and effective. + +With 'subtle', the default foreground value is retained but is now +complemented by an appropriately tinted background. The effect is more +noticeable than the default, though not by much. + +While 'intense' applies a coloured background and foreground combination +that should clearly stand out from the rest of the context. + +Thanks to Manuel Uberti for sharing feedback in issue 74: +https://gitlab.com/protesilaos/modus-themes/-/issues/74 + +3 Fringe visibility +------------------- + +A new pair of symbols supersedes older variables: + ++ modus-operandi-theme-visible-fringes ==> modus-operandi-theme-fringes ++ modus-vivendi-theme-visible-fringes ==> modus-vivendi-theme-fringes + +While the deprecated options were booleans, the current ones offer a +choice between the following: + ++ nil (default) ++ subtle ++ intense + +Nil means that the fringes have no distinct background of their own. +They still exist per the settings of 'fringe-mode', but can only be +discerned by tracking the negative space between the frame's or window's +edge and the buffer's effective boundaries. + +The 'subtle' value will apply a greyscale background that is fairly +close to the default main background (pure white/black). The fringes +are now visible. + +As its name implies, 'intense' has a more pronounced effect than the +other values. It also uses a greyscale background. + +Review of already supported faces and colours +============================================= + +1 Magit blame styles +-------------------- + +The headers that Magit's blame interface produces were difficult to tell +apart from their context. A set of carefully selected colours now makes +sure that they are always distinct. Some subtle background values are +used, in addition to other typographic elements. + +Thanks to Damien Cassou for reporting this problem and for providing +valuable feedback that informed the final design. Refer to issue 71: +https://gitlab.com/protesilaos/modus-themes/-/issues/71 + +2 Paren match colours +--------------------- + +The face that highlights the matching delimiter when 'show-paren-mode' +(or equivalent) is enabled uses two dedicated colours, whose names are: +'bg-paren-match' and 'bg-paren-match-intense'. Those have been reviewed +to make them more obvious in various contexts and to improve their +overall consistency. + +A report with relative contrast ratios is available on my website: +https://protesilaos.com/codelog/2020-08-09-modus-themes-paren-match/ + +I benefited from valuable feedback from Shreyas Ragavan in issue 70: +https://gitlab.com/protesilaos/modus-themes/-/issues/70 + +3 Mu4e faces +------------ + +Some faces were tweaked to make it easier to distinguish replied, +forwarded, and draft messages from other headers. The changes are +fairly small in scope, but the effect should be that of an overall +improvement. + +Thanks to Shreyas Ragavan for noticing these inconsistencies and for +their continued participation in addressing them. See issue 69: +https://gitlab.com/protesilaos/modus-themes/-/issues/69 + +4 Notmuch message headings +-------------------------- + +A couple of inconsistencies with how notmuch would style email addresses +and folded messages were addressed. The generic 'italic' face was also +tweaked in the process, removing the foreground it would falsely define. + +Thanks to Damien Cassou for bringing these to my attention in issue 72: +https://gitlab.com/protesilaos/modus-themes/-/issues/72 + +5 hl-todo +--------- + +Let the special keywords of 'hl-todo-mode' use an optional slant, just +like code comments do. This is to ensure that they feel part of their +context. + +6 Magit general interface +------------------------- + +Several faces were reviewed in the interest of colour harmony and to +address potential inconsistencies or exaggerations. The most noticeable +change pertains to the log views, as we now use fewer accent values, +reducing whatever unnecessary "rainbow effect" may have existed. + +7 VC commit logs +---------------- + +The presentation of 'vc-print-log' and 'vc-print-root-log' has been +reviewed to reduce the stark contrast between the colours it once used. +While the elements remain distinct, the differences between them are +more subtle, which is preferable when viewing long lists of +similar-looking patterns. + +8 Powerline +----------- + +The active and inactive minibuffers now use appropriate accented +backgrounds or foregrounds for some of their elements. This makes them +better for their intended function. + +Thanks to Shreyas Ragavan and tycho garen for their feedback in issue +73, which was actually about adding support for Spaceline. It uses +Powerline as its dependency, so we eventually had to accommodate both of +them: https://gitlab.com/protesilaos/modus-themes/-/issues/73 + +Shreyas also helped by adding a short note in the README which informs +users of those two packages on how to tweak things when conducting tests +or changing themes. See merge requests 9 and 10: + ++ https://gitlab.com/protesilaos/modus-themes/-/merge_requests/9 ++ https://gitlab.com/protesilaos/modus-themes/-/merge_requests/10 + +9 Latex sectioning +------------------ + +The themes will no longer affect the height of the Latex sectioning +faces. This is because there already exists a variable that scales them +accordingly. + +Thanks to Anders Johansson for providing insights in issue 77: +https://gitlab.com/protesilaos/modus-themes/-/issues/77 + +10 Transient pop-up menu +------------------------ + +Extended support for its new colour-coded faces that follow in the +footsteps of the 'hydra' package for visual semantics. + +11 Miscellaneous +---------------- + +The following faces were refined: + ++ 'org-formula' inherits from 'fixed-pitch' to ensure that it does not + break table layouts when the user opts for a mixed-font setup (such as + with 'M-x variable-pitch-mode'). + ++ 'bongo-elapsed-track-part' uses a more appropriate accented + background. + ++ 'symbol-overlay-default-face' is less intense than before. This is in + response to feedback I received from Manuel Uberti as an aside in + issue 75: https://gitlab.com/protesilaos/modus-themes/-/issues/75 + ++ 'rectangle-preview' uses a slightly accented background, which + distinguishes it from the highlighted region. This is to denote a + different state where the user is typing in some text. + ++ 'diff-hl-change' now uses the more appropriate yellow colour instead + of blue. Yellow denotes "mixed changes" and, therefore, stands + between "removed" (red) and "added" (green). As it so happens, yellow + is a colour that derives by mixing red with green. + +New packages +============ + +The following are now explicitly supported by the themes: + ++ org-table-sticky-header ++ pkgbuild-mode ++ semantic ++ spaceline + +More faces or face groups that are defined: + ++ git-rebase (magit) ++ doom-modeline-debug-visual ++ file-name-shadow ++ the faces used by Emacs 27's 'display-line-numbers-major-tick' and + 'display-line-numbers-minor-tick' ++ table-cell + +Final notes +=========== + +There now exists an HTML version of the README, which will hopefully +make things easier for users: https://protesilaos.com/emacs/modus-themes/ + +Other changes are not user-facing. For example, using 'pcase' instead +of 'cond' to make relevant expressions more succinct. Or defining a +coloured underline in a more straightforward way. No need to document +them at length. + +While this release introduces customisation options, it feels as though +the themes are approaching a stable state. We know what works, we have +a comprehensive colour palette that can meet our evolving needs, and we +have already achieved broad package/face coverage. All while conforming +with the overarching objective of this project for a minimum 7:1 +contrast ratio between background and foreground values in any given +combination we specify. + +I wish to thank everyone who has helped me by testing things and sharing +their thoughts. The people already mentioned herein: + +- Anders Johansson (https://gitlab.com/andersjohansson) +- Damien Cassou (https://gitlab.com/DamienCassou) +- Manuel Uberti (https://gitlab.com/muberti) +- Shreyas Ragavan (https://gitlab.com/shrysr) +- tycho garen (https://gitlab.com/tychoish) +#+end_src + +* 0.11.0 +:PROPERTIES: +:CUSTOM_ID: h:7a453154-3486-45a8-9249-9183ad49ff42 +:END: + +#+begin_src text +Modus Operandi and Modus Vivendi version 0.11.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2020-07-31 + +This entry records the changes since version 0.10.0 (2020-06-24). The +present release covers close to 100 commits, some of which introduce +far-reaching changes. It is not just the quantity that matters. +Sometimes even a minor tweak requires lots of testing and forethought. +This release represents another month of intense work and attention to +detail. + +Palette review of "nuanced" colours +=================================== + +The themes contain a subset of palette variables that have a two-fold +utility: + +1. Provide a subtle coloured background that can be combined with all + foreground colours that are intended for text/code highlighting. + +2. Produce variegated text in cases where complementary information + needs to be displayed alongside some more prominent construct + (e.g. Org table formulas). + +In early July 2020, these colours went through a comprehensive review to +improve their intended use. The complete report is available on my +website: +<https://protesilaos.com/codelog/2020-07-08-modus-themes-nuanced-colours/> + +This formed the preparatory work that enabled several of the changes +documented herein, most noticeable among which is the "Org blocks" +customisation option. + +Customisation options +===================== + +Org blocks +---------- + +1. The symbols 'modus-operandi-theme-distinct-org-blocks' and + 'modus-vivendi-theme-distinct-org-blocks' are DEPRECATED. They are + now REPLACED by the general-purpose 'modus-operandi-theme-org-blocks' + and 'modus-vivendi-theme-org-blocks' respectively. + +2. The aforementioned new symbols allow users to configure different + styles for Org blocks. + + + Option 'greyscale' (which you must quote like this: 'greyscale) + will apply a subtle grey background to the contents of the block, + while it will extend its beginning and end lines to ensure that the + area is distinct from the rest of the buffer. This is the style + you would normally get with the old customisation options. + + + Option 'rainbow' (again, must be quoted) will instead apply a + colour-coded subtle background in the main area of the block. The + exact colour depends on the programming language being used. You + would need to check the source code for how these are currently + mapped (search for "org-src-block-faces"). The basic idea is to + have different colours that make it easier for mixing the + input/output of multiple programming languages. Users who engage + in literate programming may find this particularly useful. Because + the block is already quite apparent, the beginning and end lines + are not extended to the edge of the window, to avoid exaggerations + that could create distractions. + +Variable pitch headings (proportionately-spaced headings) +--------------------------------------------------------- + +The symbols 'modus-operandi-theme-proportional-fonts' and +'modus-vivendi-theme-proportional-fonts' are DEPRECATED. They are now +REPLACED by the more appropriately-named +'modus-operandi-theme-variable-pitch-headings' and +'modus-vivendi-theme-variable-pitch-headings' respectively. + +The intended effect is exactly the same as before, namely, to let +headings in Org and relevant modes use a proportionately-spaced font +regardless of what the default is (typically a monospaced typeface). + +Remember that to configure the exact font family for the generic +'variable-pitch' face, you can use something like this: + + (set-face-attribute 'variable-pitch nil :family "FiraGO") + +Check the README for further details on setting and mixing fonts. + +Faint syntax for programming +---------------------------- + +Users can now enable 'modus-operandi-theme-faint-syntax' or +'modus-vivendi-theme-faint-syntax'. The intended effect is to tone down +all syntax highlighting in programming modes, while always respecting +the overarching objective of these themes for a minimum contrast ratio +of 7:1 (highest accessibility standard for colour contrast---WCAG AAA). + +The default is to use more saturated colours. + +Intense hl-line +--------------- + +Toggling on 'modus-operandi-theme-intense-hl-line' or +'modus-vivendi-theme-intense-hl-line' will apply a more pronounced grey +to the background of faces that highlight the current line. This +affects tools such as the built-in 'hl-line-mode', which is in turn +enabled automatically by lots of other packages, like 'elfeed' and +'mu4e'. + +The default is to use a subtle grey. + +Intense paren-match +------------------- + +Same principle as above. 'modus-operandi-theme-intense-paren-match' and +'modus-vivendi-theme-intense-paren-match' will make the matching +parentheses more intense than the default subtle warm background. This +concerns modes such as that of the 'smartparens' package as well as the +built-in 'show-paren-mode'. + +Refactored the use of bold +========================== + +A major review of the themes now makes it possible to specify the exact +weight of what a "bold" typeface is. This is only meaningful for cases +where a font family has variants such as "semibold". + +Evaluate this, replacing "semibold" with the one your typeface supports: + + (set-face-attribute 'bold nil :weight 'semibold) + +The default is to use a standard bold weight. + +Packages and face groups +======================== + +Refine already-supported faces +------------------------------ + ++ The following packages now use more appropriate colour combinations: + + - diary + - annotate + - transient (magit pop-up menu, though also used elsewhere) + - fountain + - calendar + - mu4e + - markdown-mode + - outline-minor-faces + ++ Other changes: + + - org-agenda has undergone a thoroughgoing review to improve the + semantics of colour for scheduled tasks, deadlines, modeline + filters, current date etc. + + - org and outline-mode headings have been refined to look better with + the "rainbow headings" option that was introduced in an earlier + release (check the README). + + - org-quote now works properly with the "Org blocks" option mentioned + above. + + - org-checkbox-statistics uses the same foreground colour as org-todo, + for the sake of consistency. + + - org-date now always inherits from 'fixed-pitch', to ensure proper + alignment of elements when a mixed fonts setup is used (tools for + achieving this effect are documented at length in the README). The + relevant patch was contributed by Matthew Stevenson. + + - org-meta-line no longer looks like a comment, which helps denote its + special utility (e.g. when evaluating a table's formula). + + - org-warning now uses a variant of red for its text, which works + better in the contexts this face is used (e.g. the agenda or the + export dispatcher). + + - We now apply a slightly more accented colour combination for + 'secondary-selection', which is chiefly used by Org and Calendar in + various contexts. + + - Gnus group level faces make more considerate use of colour to better + denote their significance. + + - Cited text in message buffers has a better sequence of colours. + + - Two new Helm faces are supported. + + - Let 'keycast' use a different border colour when the "3D modeline" + option is enabled (refer to the README for that option). + + - Extend 'hl-todo-keyword-faces' with the "bug" keyword. + + - More intense colour for 'diff-hl-reverted-hunk-highlight'. + + - Tone down the focused modeline's border colour. + + - Define new bespoke faces that the themes use internally. + + - Use more appropriate colours for 'header-line-highlight'. + + - Apply greyscale line highlight for flycheck current line in the + diagnostics buffer, instead of the warmer colour combination it had + before. + + - Tweak text colour difference between MU4E read and unread messages. + +Added support for new packages +------------------------------ + ++ bongo ++ boon ++ dictionary ++ eshell-fringe-status ++ eshell-git-prompt ++ eshell-prompt-extras ++ highlight-tail ++ hl-defined ++ notmuch ++ tty-menu + +Miscellaneous +============= + ++ Expand the README with new documentation and clarify parts of the + existing one. + ++ Update the Wiki page with screenshots and their descriptions (this in + itself is a day's worth of work): + https://gitlab.com/protesilaos/modus-themes/-/wikis/Screenshots + ++ Make the source code of each theme work better with the built-in + 'outline-minor-mode'. Check my video if you need a demo on how I use + this in tandem with 'imenu': + https://protesilaos.com/codelog/2020-07-20-emacs-outline-imenu/ + +Thanks to, in no particular order: + ++ Shreyas Ragavan (https://gitlab.com/shrysr) for introducing me to the + idea that derived the "rainbow" Org blocks and for providing valuable + feedback in several issues. + ++ Matthew Stevenson (https://gitlab.com/matth0204) for contributing the + aforementioned patch for the 'org-date' face. + ++ Manuel Uberti (https://gitlab.com/muberti) for offering valuable + feedback in a number of issues (and special thanks for doing this for + several months now). + ++ Dinko (https://gitlab.com/dinkonin) for noticing a not-so-obvious bug + in the initial implementation of the "rainbow Org blocks" option. + ++ okamsn (https://gitlab.com/okamsn) for providing the necessary + feedback that allowed me to refactor the use of "bold", mentioned + above. + +Refer to the issue tracker (or commit log) for further details: +https://gitlab.com/protesilaos/modus-themes/-/issues +#+end_src + +* 0.10.0 +:PROPERTIES: +:CUSTOM_ID: h:de114a53-7cbd-49aa-bf24-d1f1f0bf342e +:END: + +#+begin_src text +Modus Operandi and Modus Vivendi version 0.10.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2020-06-24 + +This entry records the changes since version 0.9.0 (2020-06-03). The +present release is focused on stability and internal improvements. + +Fixes and adjustments +--------------------- + +Basil L. Contovounesios, aka @basil-conto, (and also a contributor to +core Emacs) sent several patches that do the following: + ++ Fix top-level parentheses so that the results of + 'custom-theme-set-faces' and 'custom-theme-set-variables' are not + passed as arguments to the first 'custom-theme-set-faces'. + ++ Fix the docstrings of the custom 'modus-theme-*' faces. + ++ Simplify the syntax of properties assigned to each face. + ++ Improve the way styles are inherited by Dired and Ibuffer. + +Basil also pointed out an inconsistency with regard to an unwanted +underline effect for the 'doom-modeline-urgent' face in Modus Vivendi. +It was promptly removed. + +From my part, I fixed issues 46 and 51 that concerned the way the +compiler would evaluate each theme's palette. The palette is now +defined as a constant. Further information: + +- https://gitlab.com/protesilaos/modus-themes/-/issues/46 +- https://gitlab.com/protesilaos/modus-themes/-/issues/51 + + +Improvements to existing faces +------------------------------ + +André Alexandre Gomes (@aadcg) provided valuable feedback and +suggestions in issue 50 on the redesign of several 'org-mode' faces. + +The thread is long and contains lots of screenshots: +https://gitlab.com/protesilaos/modus-themes/-/issues/50 + +The changes in outline: + ++ Org checkboxes have a subtle background which gives them a more + pronounced appearance while retaining their overall simplicity. + ++ Org dates use a more saturated variant of cyan than they did before. + It helps distinguish them from their context. Especially true for + dates inside of tables. + ++ Org agenda dates have also undergone a slight review to match the + above. + ++ Org time grid now uses a more appropriate foreground colour, which has + been designed specifically for unfocused context. + ++ Org todo keywords use a more semantically-correct variant of red, + rather than the purple one they had before. + ++ Org statistics' cookies for pending tasks use a red variant as well + rather than the previous yellow one, in the interest of consistency + and to avoid exaggerations. + + +Other internal refinements +-------------------------- + ++ Subtle review of the Modus Vivendi palette. In short, it addresses: + + - Imbalanced levels of luminance and inconsistent differences in hue + between them and their neighbouring colours (e.g. the greens between + them, and the greens next to the yellows in the context of syntax + highlighting). The result was that they would create an undesirable + emphatic 'pop out' effect when placed close to more moderate + colours. + + - Differences in luminance and hue could lead to scenaria where two + colours could be conflated with each other or otherwise fail to + perform their intended function. + + - The complete report is on my website: + https://protesilaos.com/codelog/2020-06-13-modus-vivendi-palette-review/ + ++ Major review of the 'diredfl' faces, in the interest of improved + readability and harmony between the various colours. This benefits + from the palette changes in Modus Vivendi, but also from a similar + review to Modus Operandi that was documented in version 0.9.0. + ++ Refactor the names of dedicates colours for "marking" purposes. These + are used in Dired, Ibuffer, Proced, etc. Then apply them consistently + throughout each theme. + ++ Make sure that 'stripes' uses the same colours as 'hl-line-mode'. + ++ Let symlinks use a more appropriate colour in Dired and Trashed. + ++ Refine the use of colour in 'magit-tag', 'eshell-prompt', + 'message-header-name', 'log-edit-header', 'change-log-function', + 'message-mml', 'message-header-name', 'message-separator'. These are + subtle (i.e. difficult) tweaks that improve the overall presentation + in context. + ++ Make diff indicators not use an unnecessary background when the + user-facing option for "subtle diffs" is enabled (check the README for + the exact name of this option). This ensures consistency between the + indicators and the actual scope of the diffs. + ++ Add support for the 'minibuffer-line' package and extend existing + support of the faces used in the built-in Emacs info pages. + +My thanks to Basil and André for their contributions! +#+end_src + +* 0.9.0 +:PROPERTIES: +:CUSTOM_ID: h:96ccc8b9-2d5e-4857-bf25-4e094e17bfed +:END: + +#+begin_src text +Modus Operandi and Modus Vivendi version 0.9.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2020-06-03 + +This entry records the changes since version 0.8.0 (2020-04-28). The +present release contains about 50 commits, covering a month of active +development. + +All changes are aligned with the primary objective of this project, +which is conformance with the WCAG AAA accessibility standard for colour +contrast. This translates to a minimum contrast ratio of 7:1 between a +given combination of foreground and background colours. The highest +standard of its kind. + +All customisation options that are booleans are off ('nil') by default. +The project's policy is to offer such features on an "opt-in" basis, +while always respecting the principle of least surprise. + +Refer to the README for further information on the exact names of +symbols and the like. + +New customisation options +------------------------- + ++ It is now possible to make the faces of Icomplete, Ido, and a few + other related tools such as 'orderless', use coloured backgrounds to + style their feedback. This is the aesthetic already in effect for + Ivy, Helm, and Selectrum. The default is more subtle, in that it uses + just an accented foreground value without any added background. + ++ Advanced users can now override both the exact values of colour + variables, as well as the mapping of properties/variables to faces. + In practice this means that it is possible to completely change parts + of the theme (or the entirety of it for that matter). It also means + that users can simply access the theme's palette for the sake of + correctly passing the appropriate value to some bespoke face of + theirs. + ++ An extra increment for scaled headings is now available. This should + hold the highest value on the scale. Such variables only take effect + when the user opts for the "scaled headings" option. + +Overview of changes +------------------- + ++ A set of internal reforms were carried through in order to allow the + colour palette to be accessed from user configuration files. This + required a lot of debugging work to make sure the themes compile + properly and performance is not affected. + + - The original idea for this redesign was suggested by Len Trigg in + issue 39: https://gitlab.com/protesilaos/modus-themes/-/issues/39. + Len also provided a real-world implementation of this new option, + which is included in the project's README. + + - André Alexandre Gomes helped figure out the problems caused by the + initial design of this feature. In particular, André identified a + performance penalty as well as errors pertaining to byte + compilation. Everything was eventually resolved. For more see + issue 44: https://gitlab.com/protesilaos/modus-themes/-/issues/44. + ++ Several org-mode faces were reviewed in order to cope well with mixed + font settings. This is about use-cases where the main typeface is + proportionately-spaced, either by default or by some minor mode like + the built-in 'variable-pitch-mode'. The intent of configuring those + faces is to make them always inherit a fixed-pitch (monospace) font + family, in the interest of preserving the alignment of elements. The + idea, suggested code, as well as user feedback were offered by Ben in + issue 40: https://gitlab.com/protesilaos/modus-themes/-/issues/40. + ++ Mixed font settings may have some side-effects depending on user + configurations. This is unavoidable as we cannot control how users + define their fonts. Mark Barton reported one such case, while he was + able to fix it by making use of the suggested typeface definitions. + See issue 42: https://gitlab.com/protesilaos/modus-themes/-/issues/42. + ++ The faces for the 'tab-bar-mode' and 'tab-line-mode' that ship with + Emacs 27 were written anew. Same for those of 'centaur-tabs'. The + ideas for the redesign as well as the overall aesthetic are Ben's, per + issue 41: https://gitlab.com/protesilaos/modus-themes/-/issues/41. + ++ An edge case with Helm's interpretation of colour values for its + ripgrep interface was reported by Manuel Uberti in issue 49: + https://gitlab.com/protesilaos/modus-themes/-/issues/49. It + essentially had to do with the syntax for the regexp engine as read by + the underlying 'rg' executable. Collaboration on that front + eventually led to fixes in Helm itself, committed by its maintainer. + Note that the README for the Modus themes already contains information + on how Helm applies a face to the matches of grep or grep-like + commands. Issue 49 confirmed what was already known in that regard + (i.e. that the "--color=never" command-line option is required to use + the Helm face, else a colour value from the ANSI colour vector is + used---both are supported by the themes). + ++ The faces for Flycheck, Flymake, and Flyspell that would apply an + underline effect were completely rewritten to account for relevant + differences between GUI and TUI Emacs. + + - For GUI Emacs, all affected faces will now just use a colour-coded + wavy underline. Empowered by the introduction of dedicated + linter-related colours in prior commits (for version 0.8.0), we no + longer have to change the foreground value of the offending text in + addition to applying the underline effect. Whereas before the text + would also get repainted, which was too intrusive in most + circumstances. + + - If support for wavy underlines is not available, we assume the + presence of a TUI, which generally is relatively more limited in its + ability to reproduce colours with precision (meaning that the + dedicated linter colour could be distorted, potentially producing + inaccessible combinations). So for those cases we apply a straight + underline combined with a colour-coded foreground for the affected + text. This makes it more intense compared to the GUI equivalent, + but is the necessary course of action to overcome the constraints + imposed by the underlying terminal. + ++ The palette of Modus Operandi underwent lots of subtle changes to make + the background value of hl-line-mode more visible while retaining the + overall style and character of the theme. In principle, you should + not be able to tell the difference, unless presented with a careful + side-by-side comparison. This is the comprehensive report, including + a reproducible org-mode document with all the relevant contrast ratios: + https://protesilaos.com/codelog/2020-05-10-modus-operandi-palette-review/. + ++ Fixed `org-hide' to actually "hide" by using the appropriate colour + value. + ++ Several other face groups received minor tweaks. + ++ The README was improved to better present the available customisation + options and to cover other topics of interest. + ++ Updated the screen shots and their description in the relevant Wiki + page: https://gitlab.com/protesilaos/modus-themes/-/wikis/Screenshots. + +Added support for +----------------- + ++ circe ++ el-search ++ eros ++ golden-ratio-scroll-screen ++ highlight-indentation ++ hyperlist ++ indium ++ journalctl-mode ++ minimap ++ nxml-mode ++ vdiff ++ yasnippet +#+end_src + +* 0.8.0 +:PROPERTIES: +:CUSTOM_ID: h:afa34aec-7079-4c45-8e16-ab4e7cc8cd6a +:END: + +#+begin_src text +Modus Operandi and Modus Vivendi version 0.8.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2020-04-28 + +This entry records the changes since version 0.7.0 (2020-03-30). The +present release contains a little more than a hundred commits, covering +one month of intense work. + +All changes are aligned with the primary objective of this project, +which is conformance with the WCAG AAA accessibility standard for colour +contrast. This translates to a minimum contrast ratio of 7:1 between a +given combination of foreground and background colours. + +All customisation options mentioned herein are off ('nil') by default. +The project's policy is to offer such features on an "opt-in" basis, +while always respecting the principle of least surprise. + +Refer to the README for further information. + + +Four new customisation options +------------------------------ + +The options in outline, with their detailed description below: + ++ Rainbow headings ++ Section headings ++ 3D modeline ++ Subtle diffs + +1. "Rainbow headings" will apply more vivid colours to headings in + 'org-mode' and 'outline-mode'. The gradation is similar to that of a + rainbow's colour spectrum. + + The default is to use colour values that are closer to the grey + scale. + +2. "Section headings" also apply to 'org-mode' and 'outline-mode'. They + will draw an overline over each heading and use a nuanced background + colour that is appropriate for each level. For Org, this option has + some additional effects, where it will render keywords and priority + cookies in a box and add to them a subtle background. This is to + make sure that everything feels consistent (to the extent possible). + + The default is to not use overlines, backgrounds, boxes in any of the + relevant faces. This is consistent with the standard austere + colouration of headings: to not deviate too much from a "plain text" + aesthetic. + +NOTE: "rainbow headings" and "section headings" can work on their own or +be combined together. + +3. "3D modeline" will use a faux unpressed button style for the current + window's modeline (like the standard looks of 'emacs -Q'). The + colours used for the active and inactive modelines are tweaked + accordingly to maximise the effect while retaining the visual + distinction between them. + + The default is to draw the modelines in a two-dimensional style, with + the active one having a more noticeable border around it. + +4. "Subtle diffs" will use colour-coded text for line-wise differences + without applying any appropriately-coded background value or, where + necessary, by using only a subtle greyscale background. This affects + 'diff-mode', 'magit', 'ediff', and 'smerge-mode'. For Magit an extra + set of tweaks is implemented to account for the differentiation + between the focused and unfocused diff hunks. + + Due to their unique requirements, word-wise or refined changes are + always drawn with a colour-coded background, though it is less + intense when this option is enabled. + + The default is to use a colour-coded background and foreground + combination (e.g. light green text on a dark green backdrop) and to + make appropriate adjustments for refined diffs and modes of + interaction such as Magit's focused/unfocused diff states. + + +Other major refinements +----------------------- + ++ Thoroughly revise the colours of 'ediff' and 'smerge-mode', so that + they are aligned with those of 'diff-mode' and 'magit'. This is in + addition to the "subtle diffs" options mentioned in the previous + section. + ++ Review the faces used by Flycheck and Flymake. A wavy/curly underline + is now used in all terminals that support it. The underlined text is + drawn with a more nuanced foreground than before. The previous design + was exaggerating an already clear effect and could make things more + difficult under certain circumstances. + ++ All language checkers, including the aforementioned linter front-ends, + now benefit from a new set of colours that are designed specifically + for this particular purpose. Makes the affected faces feel more + different than their context. + ++ Use dedicated colours for escape sequences, regular expression + constructs, and quoted characters. The goal is to better + differentiate them from their surroundings. + ++ Tweak the colours of 'hydra' to improve the distinction between its + various types of behaviour. + ++ Reduce the overall luminance of the background colours used in the + fringes by the likes of 'flycheck', 'flymake', 'diff-hl', etc. They + should now not stand out more than they should, while retaining their + intended role. + ++ Implement more saturated colours in Elfeed. The previous choices + could make it harder to differentiate the various parts of the + presentation. + ++ Make better use of the customisation options for bold and slanted + constructs where that is allowed. If a face is not tied to the + semantics of these styles then it is drawn without them, unless the + user specifically opts for the relevant customisation options. + + +Added support for packages (A-Z) +-------------------------------- + ++ ag ++ color-rg ++ ctrlf ++ debbugs ++ eglot ++ forge ++ helpful ++ highlight-symbol ++ ibuffer ++ icomplete ++ iflipb ++ magit-imerge ++ man ++ orderless ++ page-break-lines ++ parrot ++ phi-grep ++ phi-search ++ pomidor ++ rcirc ++ spell-fu ++ switch-window ++ swoop ++ tab-bar-mode ++ tab-line-mode ++ trashed ++ tomatinho ++ tuareg ++ vimish-fold ++ visible-mark ++ vterm ++ wcheck-mode ++ winum ++ woman + + +Miscellaneous changes and concluding remarks +-------------------------------------------- + ++ Rewrote large parts of the README to make the customisation options + easier to discover and understand. + ++ Updated the screen shots and their description in the relevant Wiki + page: https://gitlab.com/protesilaos/modus-themes/-/wikis/Screenshots +#+end_src + +* 0.7.0 +:PROPERTIES: +:CUSTOM_ID: h:353114b7-6980-4622-8057-b8cbb8361a8a +:END: + +#+begin_src text +Modus Operandi and Modus Vivendi version 0.7.0 + +By Protesilaos Stavrou <info@protesilaos.com> on 2020-03-30 + +This entry documents the changes since version 0.6.0 (2020-03-01). The +present release is the largest to date containing 110 commits. + +All changes conform with the primary objective of this project, which is +conformance with the WCAG AAA accessibility standard for colour +contrast. This represents a minimum contrast ratio of 7:1 between a +given combination of foreground and background colours. + +All customisation options mentioned herein are off ('nil') by default. +The project's policy is to offer such features on an "opt-in" basis. +Refer to the README or each theme's source code for the names of these +user-facing symbols. + +Major refinements to existing face groups +----------------------------------------- + ++ The headline feature of this release is a refined set of colours for + visualising version-control-system differences ("diffs"). The new + colours are less intense than before and are designed to better convey + the meaning of the constructs they apply to. Affected face groups are + those of 'magit' and 'diff-mode'. A future release will assess how + similar packages, such as 'ediff', can benefit from this work. + ++ The other major set of changes concerns the colours that apply to + fringes (see 'fringe-mode'). A new customisation option allows for a + distinct background for the fringes (courtesy of Anders Johansson in + commit 80fb704). The default uses the same colours as the main + buffer's background. Building on this effort, fringe indicators, such + as those of 'flycheck' now benefit from an entirely new set of + background+foreground colour combinations that are designed + specifically for the fringes. + ++ A new customisation option allows users to render 'org-mode' source + blocks in a distinct background colour. The default is to use the + same background as the rest of the buffer. When this option is + enabled, the background colour for the beginning and end line of such + blocks is extended to the end of the window (using the ':extend t' + attribute for >= Emacs 27). Older Emacs versions already extend to + the end of the window. + ++ The colour combination that shows the matching parentheses or + delimiters has been reviewed. The commit is fairly small and the + changes are immediately noticeable only to the most discerning of + eyes. Still, the considerations informing the review imposed a + rigorous method. Rather than summarise the findings, interested + readers are advised to refer to commit af3a327: it offers a + comprehensive analysis on the matter. + +Added support for packages (A-Z) +-------------------------------- + ++ auctex/tex ++ bm ++ buffer-expose ++ centaur-tabs ++ cider (tentative, feedback is much appreciated) ++ csv-mode ++ dynamic-ruler ++ ebdb ++ elfeed-score ++ flyspell-correct ++ fold-this ++ freeze-it ++ frog-menu ++ git-walktree ++ helm-switch-shell ++ highlight-defined ++ highlight-escape-sequences (hes-mode) ++ highlight-numbers ++ highlight-thing ++ hl-todo ++ ioccur ++ julia ++ kaocha-runner ++ markup-faces (adoc-mode) ++ multiple-cursors ++ num3-mode ++ org-roam ++ org-superstar ++ org-treescope ++ outline-minor-mode ++ paradox ++ rainbow-identifiers ++ rg ++ ripgrep ++ sallet (tentative, feedback is much appreciated) ++ selectrum ++ sesman ++ side-notes ++ skewer-mode ++ stripes ++ symbol-overlay ++ syslog-mode ++ vc-annotate (C-x v g) ++ volatile-highlights ++ web-mode ++ yaml-mode + +Note about VC-annotate +---------------------- + +Quoting from the relevant note in the project's README: + + Due to the unique way `vc-annotate' (`C-x v g') applies colours, + support for its background mode (`vc-annotate-background-mode') is + disabled at the theme level. + + Normally, such a drastic measure should not belong in a theme: + assuming the user's preferences is bad practice. However, it has + been deemed necessary in the interest of preserving colour contrast + accessibility while still supporting a useful built-in tool. + + If there actually is a way to avoid such a course of action, without + prejudice to the accessibility standard of this project, then please + report as much (or contribute as per the information in the + Contributing section). + + +Overview of refinements to already supported packages +----------------------------------------------------- + +In this section the notion of "dedicated colours" pertains to colour +values that are reserved for special faces. They are never used for +syntax highlighting or other common scenaria. + ++ Define new background colours for fringe indicators (as noted in the + first section). Apply them to 'bm', 'diff-hl', 'git-gutter', + 'flycheck' fringe indicators. All such indicators are now made more + visible and work better with the new customisation option for + rendering the fringes in a distinct background. + ++ Define dedicated colours for tab-like interfaces. Currently these + apply only to 'centaur-tabs'. The intention is to eventually + implement them to the tab modes that ship with Emacs 27, as well as + any other package that offers such functionality. + ++ Define dedicated colours for actions that "mark" items. Use them in + 'dired', 'proced', 'gnus'. An accented background is combined with an + accented foreground. The intention is to make the underlying + construct distinct even under circumstances where the mark's + background changes, such as when it intersects with 'hl-line-mode' or + 'stripes': the accented foreground will still be recognisable as a + colour that differs from the main foreground. The use of a bold font + weight further reinforces the intended action. + ++ Refine 'dired' faces to account for the new "mark" styles. + Directories are no longer rendered in a bold weight. + ++ Tweak the colours used in the built-in 'diary' and 'calendar' for + better usability. + ++ Tweak 'deadgrep' colours for consistency with packages that offer + similar functionality. + ++ Tweak 'compilation-line-number' in the interest of consistency with + similar interfaces. + ++ Use a more appropriate colour for 'trailing-whitespace'. It now is a + colour value that was designed specifically as a background. + ++ Expand 'fountain-mode' support by covering its new heading faces. The + headings will be presented in larger font sizes, or using proportional + fonts, should the user enable the relevant theme customisation options + (see README or source code). + ++ Remove bold weight from matching parentheses in 'show-paren-mode' and + 'smartparens'. The temporarily applied bold weight can cause + misalignments while using certain fonts. Also apply the new colours + for matching delimiters, as documented in the first section. + ++ Refine 'outline-mode' colours to be consistent with those of Org's + headings. + ++ Several usability and colour refinements for 'helm' and related + packages in that milieu. + ++ Remove box property from emphasis markers in the mode line. It + created inconsistencies with other faces. + ++ Refine the colours used in Magit logs, `change-log', `log-view'. They + are meant to be more distinct from their context, without drawing too + much attention to themselves. + ++ Minor internal fixes for indentation and the like. + +Miscellaneous changes and concluding remarks +-------------------------------------------- + ++ Add section in the README which documents a legal requirement for all + potential non-trivial code contributions: the need to assign copyright + to the Free Software Foundation. The Modus Themes are now distributed + via the official GNU ELPA repository and copyright over them is + assigned to the FSF. + ++ Add CHANGELOG file which consolidates all tagged release notes such as + this one. + ++ Add new screen shots to the relevant Wiki page, together with detailed + descriptions on what is being demonstrated: + https://gitlab.com/protesilaos/modus-themes/-/wikis/Screenshots + +Special thanks to Manuel Uberti for reporting several issues and +offering feedback where appropriate. I was able to add support for lots +of new packages. While a few among the already supported face groups +underwent tweaks and refinements. The 'helm' ecosystem benefited the +most. + +Thanks to Anders Johansson for the patch that introduced the +fringes-related customisation option. It inspired me to reconsider the +use of this particular area of the interface, which eventually led to +the barrage of commits that refashioned the fringe indicators. A major +win overall. + +Thanks to Jonathan Otsuka for fixing an error of mine on the naming of +some symbols. My apologies for missing it: I will be more careful from +now on. + +Note: both patches were small, requiring no copyright assignment. +Larger contributions are always welcome, though make sure you read the +section in the README with regard to assigning copyright to the Free +Software Foundation. +#+end_src + +* 0.6.0 +:PROPERTIES: +:CUSTOM_ID: h:c8c33ff2-6f75-4642-a27e-ee6e8abc493e +:END: + +#+begin_src text +This release contains lots of refinements and additions. + +Let me start with an administrative point: I have completed the process +of assigning my copy rights to the Free Software Foundation. This +covers every contribution I make to GNU Emacs. In practice, it means +that the Modus themes can now be included in the official ELPA archive +and theoretically be shipped with Emacs itself. The ELPA inclusion is +ongoing. Once it is completed, I will update the docs accordingly. + +The administrative change has no effect on the way this project is +handled. I still am the developer/maintainer and will continue to +improve things further. If you still have questions, feel free to +contact me: https://protesilaos.com/contact + +Moving on to the changes since version 0.5.0 (2020-01-26). + +Added support for: + ++ alert ++ apropos (built-in) ++ dap-mode ++ deft ++ dim-autoload ++ dired-git ++ enhanced-ruby-mode ++ gbd-mi.el (built-in library) ++ helm-ls-git ++ helm-xref ++ imenu-list ++ jira (org-jira) ++ js2-mode ++ jupyter ++ org-pomodoro ++ origami ++ rmail (built-in) ++ vc-print-log (built-in) ++ window-divider-mode (built-in) ++ xref (built-in) + +Refinements to existing faces: + ++ A new subset of "nuanced" accent colours has been introduced. These +are named {red,green,yellow,blue,magenta,cyan}-nuanced. Their purpose +is to be used in contexts where lots of structured information is +presented to the user, but each component does not need to draw too much +attention to itself (e.g. Org's metadata). As always, their contrast +ratio is designed to always be >= 7:1 relative to the backgrounds they +may be combined with. + ++ Greatly improve the support for Gnus, even though most changes are +subtle and are made in the interest of consistency. The group levels +now make use of the "nuanced" palette where appropriate (to denote +levels of lower importance). + ++ Several refinements for Org, including the use of "nuanced" colours +for various metadata tags. The agenda headers will now be scaled +appropriately and use a variable-pitch font if the user sets the +relevant customisation values of the theme they are using (check the +documentation in each theme file or the repo's README). + ++ Lots of refinements for Helm. Some of these were introduced to align +the overall aesthetic with equivalent metaphors in Ivy. Others are +meant to improve the styles of the headers and make various constructs +consistent with their variants in the Helm ecosystem but also with their +non-Helm counterparts (such as xref file names with and without Helm, +but also with Helm's grep). + ++ Improve the colours of buttons in contexts such as M-x customize. +This is especially noticeable in modus-vivendi-theme (the dark theme) +where the buttons are a darker shade of grey rather than the original +lighter one. + ++ Keycast now uses styles that are more consistent with the overall +aesthetic of the Modus themes. This means that the mode line indicators +are blue-ish (blue is generally used for highlights in the mode line, +but also when hovering over an item with the mouse pointer). The pseudo +button effect (colours + 3d) has been removed in favour of a flat look, +in line with the flatness of the mode line itself. Whereas before the +keycast faces where designed to be consistent with the package's +defaults. + +There were also a few minor refinements for: + ++ calendar and diary ++ icomplete ++ mm-uu-extract ++ nobreak-hyphen and nobreak-space ++ org-habit ++ tooltip-mode + +Finally, the Commentary section of each theme has been greatly expanded. +It now includes the user-facing customisation options and the complete +list of supported packages. +#+end_src + +* 0.5.0 +:PROPERTIES: +:CUSTOM_ID: h:dffc2bd4-6597-4be4-88f6-b349be7ebc6e +:END: + +#+begin_src text +This release contains support for several new packages and lots of +refinements for existing ones. A lot of work went into making the +themes more robust by reviewing the inheritance of styles from one +face group to another (in general, the ':inherit' property should not +be used frivolously). Several subtle changes were made to the colour +palette of both themes to ensure consistency, enable more possible +combinations, and avoid potential ambiguity under certain potential +circumstances. + +Overall, this release gives me confidence that the themes have reached +a fairly stable state. What follows is an overview of the changes +since version 0.4.0 (2020-01-02). + +Added support for: + ++ equake ++ flymake ++ focus ++ fountain (fountain-mode) ++ git-lens ++ git-timemachine ++ hi-fill-column ++ highlight-blocks ++ info-colors ++ lsp-mode ++ lsp-ui ++ proced (built-in) ++ regexp-builder (built-in) ++ suggest + +Refinements: + ++ The header line uses its own dedicated colours. Several changes + were made in 'eww', 'info', 'elfeed', 'magit', 'flycheck' to make + sure that any accent value that appears there conforms with the + overarching accessibility objective of the Modus themes (contrast + ratio of >= 7:1, else WCAG AAA). ++ 'ivy' no longer uses a box style for the current line, as that was + not always reliable. Appropriate colours are used instead. ++ 'org-mode' blocks use a foreground value that distinguishes their + opening and closing tags from source code comments. ++ The 'org-ellipsis' face was configured to always inherit the looks + of its respective heading or element, rather than have its own + excessive styling. ++ 'paren-match' has colours that are designed specifically for it. + This is done to retain their utility while making sure they are not + mistaken for some other type of feedback. ++ 'magit' has explicit styles for the mode line process indicators, + instead of inheriting from another face. The intention is to use + foreground values that are designed specifically for use on the mode + line (the minimum contrast ratio requirement). ++ 'erc' faces have been thoroughly reviewed in the interest of better + usability. Its mode line indicators now use appropriate colours. ++ The faces of the 'messages' library have been thoroughly reviewed. + This affects various email interfaces, but also 'elfeed' entry + metadata headings. ++ 'whitespace-mode' no longer has a newline character that stands out. + That kind of emphasis was not necessary, given that the symbol used + is a dollar sign, which is already far more visible than a mid dot. ++ 'font-lock' (generic syntax highlighting) has better colour + combinations for regexp grouping constructs. ++ 'rainbow-delimiters' was given its missing base error face. ++ 'git-commit' comment action uses a slightly different foreground + value than before to better match its context. ++ 'isearch' and 'query-replace' use colours that properly denote each + action's utility. ++ 'visual-regexp' has been reviewed to make the matching groups more + distinct from each other. ++ 'occur' and any other buffer that relies on the 'match' face can now + benefit from the new colour combinations, in that its results cannot + be confused for the active 'isearch' or 'query-replace' or even + their lazily highlighted results (or, indeed, of any other search + tool). ++ 'company' uses faces for its search feedback that are consistent + with other search metaphors. ++ Emacs 27's new ':extend' property is only implemented where + necessary (note that the latest release is version 26.3). +#+end_src + +* 0.4.0 +:PROPERTIES: +:CUSTOM_ID: h:1597e301-f9df-4aac-8ec5-b8ecf34f2930 +:END: + +#+begin_src text +This is an overview of the changes since version 0.3.0 (2019-12-25). + +Add support for: + + + ert + + flycheck-indicator + + mentor + + mu4e-conversation + + powerline-evil + + telephone-line + + vc (built-in version control) + +Refinements to already-supported packages: + + + company-mode (several refinements) + + doom-modeline (major review) + + helm (several tweaks) + + hl-line-mode (use unique background) + + ivy (improve matching line) + + line-number-mode (minor tweaks) + + markdown-mode (comprehensive expansion) + + mode-line (more appropriate styles for the highlight) + + powerline (minor tweaks) + + region (use unique background) + + swiper (improve matching line in main window) + + whitespace-mode (several refinements) + + mu4e (tweak mu4e-modeline-face for consistency) + +Miscellaneous: + + + Fix actual and potential problems with cursor faces that would + distort the use of appropriate background and foreground colours. + The documentation stipulates that the `cursor' face cannot be + inherited by other faces, due to its peculiar nature of only + recognising the background colour. + + Add support for more bold constructs in code. As with all such + options, it is disabled by default, expecting the user to + explicitly opt in. + + Declare additional custom faces. Only meant for internal use. + + Subtle refinements to "active" colour values in both Modus + Operandi and Modus Vivendi. These mostly concern the mode line + (with a few special exceptions), where emphasis has been placed on + the need to provide greater contrast between accent values that + can be used there. + + Minor documentation refinements. +#+end_src + +* 0.3.0 +:PROPERTIES: +:CUSTOM_ID: h:cb0ca8dc-3960-4490-b3c4-27d10cf6ed44 +:END: + +#+begin_src text +Overview of changes since 0.2.0 (2019-12-18): + ++ Add support for the following packages: + + + apt-sources-list + + calfw + + counsel-css + + counsel-notmuch + + counsel-org-capture-string + + cov + + disk-usage + + evil-visual-mark-mode + + geiser + + keycast + + org-journal + + org-noter + + paren-face + + powerline + + vc + + xah-elisp-mode + ++ Explicitly style the following packages (these were already covered, + in terms of the colours they used, but are now targeted directly): + + + calendar + + counsel + + cursor + + package (M-x list-packages) + ++ Minor tweaks to face groups: + + + dired + + compile + ++ Fixes and refinements: + + + Documentation strings will now inherit the option for slanted + constructs (off by default -- see the README about all the user + options). + + Comment delimiters have the same styles as the body of the comment + to avoid inconsistencies when the option for slanted constructs is + enabled. + + The line number that is displayed in the compile log is now + correctly styled. + + Removed duplicate entries for ivy-remote and added ivy-separator. + + Ensure that the minibuffer prompt is always above the minimum + contrast ratio of 7:1, by using a more appropriate shade of cyan. + + Properly reference a couple of variables in Modus Vivendi. + ++ Internal adjustments: + + + Decouple the core dired faces from those of external packages. + + Same for org and org-recur. + ++ Minor documentation updates. +#+end_src + +* 0.2.0 +:PROPERTIES: +:CUSTOM_ID: h:c9746d04-adf4-41b1-9b7c-6caaf17f8816 +:END: + +#+begin_src text +Overview of changes since 0.1.0 (2019-12-09): + ++ Comprehensive review of `org-mode' faces. The use of colour should +now be more consistent with the semantics of each element. These should +also respond better to a variety of combinations, such as when the user +has `hl-line-mode' enabled. The agenda view is the greatest beneficiary +of this review. + ++ Make `mu4e' mode line faces consistent with other elements that may be +placed on the mode line. + ++ Make `gnus' header name/subject more distinct. + ++ Several minor refinements to `ivy' and its extensions. + ++ General usability refinements to `ace-window'. + ++ Minor review of `elfeed' styles, in the interest of improving the +contrast between the elements. + ++ Add support for: + + `persp-mode' (fork of the already supported `perspective') + + `dashboard' + + `evil-mode' + + `evil-goggles' + + `ruler-mode' +#+end_src + +* 0.1.0 +:PROPERTIES: +:CUSTOM_ID: h:e14e612e-6951-4812-bc88-62c498bd5644 +:END: + +#+begin_src text +First stable release of Modus Operandi and Modus Vivendi. +#+end_src diff --git a/elpa/modus-themes-4.3.0/README-elpa b/elpa/modus-themes-4.3.0/README-elpa @@ -0,0 +1,33 @@ +# Modus themes for GNU Emacs + +IMAGES HERE: <https://protesilaos.com/emacs/modus-themes-pictures>. + +Highly accessible themes, conforming with the highest standard for +colour contrast between background and foreground values (WCAG AAA). +They also are optimised for users with red-green colour deficiency. + +The themes are very customisable and provide support for a very wide +range of packages. Their manual is detailed so that new users can get +started, while it also provides custom code for all sorts of more +advanced customisations. + +Since August 2020, the original Modus themes (`modus-operandi`, +`modus-vivendi`) are built into Emacs version 28 or higher. Emacs 28 +ships with `modus-themes` version `1.6.0`. Emacs 29 includes version +`3.0.0`. Emacs 30 provides a newer, refactored version that +thoroughly refashions how the themes are implemented and customized. +Such major versions are not backward-compatible due to the limited +resources at my disposal to support multiple versions of Emacs and of +the themes across the years. + ++ Package name (GNU ELPA): `modus-themes` ++ Official manual: <https://protesilaos.com/emacs/modus-themes> ++ Change log: <https://protesilaos.com/emacs/modus-themes-changelog> ++ Colour palette: <https://protesilaos.com/emacs/modus-themes-colors> ++ Sample pictures: <https://protesilaos.com/emacs/modus-themes-pictures> ++ Git repo on SourceHut: <https://git.sr.ht/~protesilaos/modus-themes> + - Mirrors: + + GitHub: <https://github.com/protesilaos/modus-themes> + + GitLab: <https://gitlab.com/protesilaos/modus-themes> ++ Mailing list: <https://lists.sr.ht/~protesilaos/modus-themes> ++ Backronym: My Old Display Unexpectedly Sharpened ... themes diff --git a/elpa/modus-themes-4.3.0/README.md b/elpa/modus-themes-4.3.0/README.md @@ -0,0 +1,33 @@ +# Modus themes for GNU Emacs + +IMAGES HERE: <https://protesilaos.com/emacs/modus-themes-pictures>. + +Highly accessible themes, conforming with the highest standard for +colour contrast between background and foreground values (WCAG AAA). +They also are optimised for users with red-green colour deficiency. + +The themes are very customisable and provide support for a very wide +range of packages. Their manual is detailed so that new users can get +started, while it also provides custom code for all sorts of more +advanced customisations. + +Since August 2020, the original Modus themes (`modus-operandi`, +`modus-vivendi`) are built into Emacs version 28 or higher. Emacs 28 +ships with `modus-themes` version `1.6.0`. Emacs 29 includes version +`3.0.0`. Emacs 30 provides a newer, refactored version that +thoroughly refashions how the themes are implemented and customized. +Such major versions are not backward-compatible due to the limited +resources at my disposal to support multiple versions of Emacs and of +the themes across the years. + ++ Package name (GNU ELPA): `modus-themes` ++ Official manual: <https://protesilaos.com/emacs/modus-themes> ++ Change log: <https://protesilaos.com/emacs/modus-themes-changelog> ++ Colour palette: <https://protesilaos.com/emacs/modus-themes-colors> ++ Sample pictures: <https://protesilaos.com/emacs/modus-themes-pictures> ++ Git repo on SourceHut: <https://git.sr.ht/~protesilaos/modus-themes> + - Mirrors: + + GitHub: <https://github.com/protesilaos/modus-themes> + + GitLab: <https://gitlab.com/protesilaos/modus-themes> ++ Mailing list: <https://lists.sr.ht/~protesilaos/modus-themes> ++ Backronym: My Old Display Unexpectedly Sharpened ... themes diff --git a/elpa/modus-themes-4.3.0/dir b/elpa/modus-themes-4.3.0/dir @@ -0,0 +1,19 @@ +This is the file .../info/dir, which contains the +topmost node of the Info hierarchy, called (dir)Top. +The first time you invoke Info you start off looking at this node. + +File: dir, Node: Top This is the top of the INFO tree + + This (the Directory node) gives a menu of major topics. + Typing "q" exits, "H" lists all Info commands, "d" returns here, + "h" gives a primer for first-timers, + "mEmacs<Return>" visits the Emacs manual, etc. + + In Emacs, you can click mouse button 2 on a menu item or cross reference + to select it. + +* Menu: + +Emacs misc features +* Modus Themes: (modus-themes). Elegant, highly legible and customizable + themes. diff --git a/elpa/modus-themes-4.3.0/doc/doclicense.texi b/elpa/modus-themes-4.3.0/doc/doclicense.texi @@ -0,0 +1,505 @@ +@c The GNU Free Documentation License. +@center Version 1.3, 3 November 2008 + +@c This file is intended to be included within another document, +@c hence no sectioning command or @node. + +@display +Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. +@uref{https://fsf.org/} + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document @dfn{free} in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of ``copyleft'', which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The ``Document'', below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as ``you''. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not ``Transparent'' is called ``Opaque''. + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, La@TeX{} input +format, SGML or XML using a publicly available +DTD, and standard-conforming simple HTML, +PostScript or PDF designed for human modification. Examples +of transparent image formats include PNG, XCF and +JPG@. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, SGML or +XML for which the DTD and/or processing tools are +not generally available, and the machine-generated HTML, +PostScript or PDF produced by some word processors for +output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The ``publisher'' means any person or entity that distributes copies +of the Document to the public. + +A section ``Entitled XYZ'' means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as ``Acknowledgements'', +``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' +of such a section when you modify the Document means that it remains a +section ``Entitled XYZ'' according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +@item +COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +@enumerate A +@item +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +@item +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +@item +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +@item +Preserve all the copyright notices of the Document. + +@item +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +@item +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +@item +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +@item +Include an unaltered copy of this License. + +@item +Preserve the section Entitled ``History'', Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled ``History'' in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +@item +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the ``History'' section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +@item +For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +@item +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +@item +Delete any section Entitled ``Endorsements''. Such a section +may not be included in the Modified Version. + +@item +Do not retitle any existing section to be Entitled ``Endorsements'' or +to conflict in title with any Invariant Section. + +@item +Preserve any Warranty Disclaimers. +@end enumerate + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled ``Endorsements'', provided it contains +nothing but endorsements of your Modified Version by various +parties---for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled ``History'' +in the various original documents, forming one section Entitled +``History''; likewise combine any sections Entitled ``Acknowledgements'', +and any sections Entitled ``Dedications''. You must delete all +sections Entitled ``Endorsements.'' + +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an ``aggregate'' if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled ``Acknowledgements'', +``Dedications'', or ``History'', the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + +@item +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +@uref{https://www.gnu.org/licenses/}. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +@item +RELICENSING + +``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the +site means any set of copyrightable works thus published on the MMC +site. + +``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +``Incorporate'' means to publish or republish a Document, in whole or +in part, as part of another Document. + +An MMC is ``eligible for relicensing'' if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + +@end enumerate + +@page +@heading ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the ``with@dots{}Texts.''@: line with this: + +@smallexample +@group + with the Invariant Sections being @var{list their titles}, with + the Front-Cover Texts being @var{list}, and with the Back-Cover Texts + being @var{list}. +@end group +@end smallexample + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@c Local Variables: +@c ispell-local-pdict: "ispell-dict" +@c End: diff --git a/elpa/modus-themes-4.3.0/doc/modus-themes.info b/elpa/modus-themes-4.3.0/doc/modus-themes.info @@ -0,0 +1,6278 @@ +This is modus-themes.info, produced by makeinfo version 7.0.3 from +modus-themes.texi. + +Copyright (C) 2020-2023 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being “A GNU Manual,” and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + “GNU Free Documentation License.” + + (a) The FSF’s Back-Cover Text is: “You have the freedom to copy and + modify this GNU manual.” + +INFO-DIR-SECTION Emacs misc features +START-INFO-DIR-ENTRY +* Modus Themes: (modus-themes). Elegant, highly legible and customizable themes. +END-INFO-DIR-ENTRY + + +File: modus-themes.info, Node: Top, Next: Overview, Up: (dir) + +Modus themes for GNU Emacs +************************** + +Copyright (C) 2020-2023 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being “A GNU Manual,” and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + “GNU Free Documentation License.” + + (a) The FSF’s Back-Cover Text is: “You have the freedom to copy and + modify this GNU manual.” + + This manual, written by Protesilaos Stavrou, describes the +customization options for the Modus themes, and provides every other +piece of information pertinent to them. + + The documentation furnished herein corresponds to stable version +4.3.0, released on 2023-09-19. Any reference to a newer feature which +does not yet form part of the latest tagged commit, is explicitly marked +as such. + + Current development target is 4.4.0-dev. + + • Package name (GNU ELPA): ‘modus-themes’ + • Official manual: <https://protesilaos.com/emacs/modus-themes> + • Change log: <https://protesilaos.com/emacs/modus-themes-changelog> + • Color palette: <https://protesilaos.com/emacs/modus-themes-colors> + • Sample pictures: + <https://protesilaos.com/emacs/modus-themes-pictures> + • Git repo on SourceHut: + <https://git.sr.ht/~protesilaos/modus-themes> + • Mirrors: + • GitHub: <https://github.com/protesilaos/modus-themes> + • GitLab: <https://gitlab.com/protesilaos/modus-themes> + • Mailing list: <https://lists.sr.ht/~protesilaos/modus-themes> + • Backronym: My Old Display Unexpectedly Sharpened ... themes + +* Menu: + +* Overview:: +* Installation:: +* Enable and load:: +* Customization options:: +* Advanced customization:: +* Face coverage:: +* Notes on individual packages:: +* Frequently Asked Questions:: +* Contributing:: +* Acknowledgements:: +* GNU Free Documentation License:: +* Indices:: + +— The Detailed Node Listing — + +Overview + +* How do the themes look like:: +* Learn about the latest changes:: + +Installation + +* Install manually from source:: +* Install from the archives:: +* Install on GNU/Linux:: +* Dealing with byte compilation errors:: + +Install on GNU/Linux + +* Debian 11 Bullseye:: +* GNU Guix:: + +Enable and load + +* The require-theme for built-in Emacs themes:: +* Sample configuration with and without use-package:: +* Differences between loading and enabling:: + +Customization options + +* Custom reload theme:: Toggle auto-reload of the theme when setting custom variables +* Disable other themes:: Determine whether loading a Modus themes disables all others +* Bold constructs:: Toggle bold constructs in code +* Italic constructs:: Toggle italic font constructs in code +* Mixed fonts:: Toggle mixing of font families +* Command prompts:: Control the style of command prompts +* Completion UIs:: Choose among several styles for completion UIs +* Org mode blocks:: Choose among plain, gray, or tinted backgrounds +* Heading styles:: Choose among several styles, also per heading level +* UI typeface:: Toggle the use of variable-pitch across the User Interface +* Palette overrides:: Refashion color values and/or semantic color mappings + +Advanced customization + +* Palette override presets:: +* Stylistic variants using palette overrides:: +* More accurate colors in terminal emulators:: +* Range of color with terminal emulators:: +* Preview theme colors:: +* Per-theme customization settings:: +* Get a single color from the palette:: +* Use theme colors in code with modus-themes-with-colors:: +* Do not extend the region background:: +* Add padding to mode line:: +* Remap face with local value:: +* Font configurations for Org and others:: +* Configure bold and italic faces:: +* Custom Org todo keyword and priority faces:: +* Custom Org emphasis faces:: +* Update Org block delimiter fontification:: +* Measure color contrast:: +* Load theme depending on time of day:: +* Backdrop for pdf-tools:: +* Toggle themes without reloading them:: +* A theme-agnostic hook for theme loading:: +* Use more spacious margins or padding in Emacs frames:: +* Custom hl-todo colors:: +* Add support for solaire-mode:: + +Stylistic variants using palette overrides + +* Make the mode line borderless:: +* Make the active mode line colorful:: +* Make the tab bar more or less colorful:: +* Make the fringe invisible or another color:: +* Make links use subtle or no underlines:: +* Make prompts more or less colorful:: +* Make completion matches more or less colorful:: +* Make comments yellow and strings green:: +* Make code syntax use the old alt-syntax style:: +* Make use of alternative styles for code syntax:: +* Make matching parenthesis more or less intense:: +* Make box buttons more or less gray:: +* Make TODO and DONE more or less intense:: +* Make headings more or less colorful:: +* Make Org agenda more or less colorful:: +* Make inline code in prose use alternative styles:: +* Make mail citations and headers more or less colorful:: +* Make the region preserve text colors, plus other styles: Make the region preserve text colors plus other styles. +* Make mouse highlights more or less colorful:: +* Make language underlines less colorful:: +* Make line numbers use alternative styles:: +* Make diffs use only a foreground:: +* Make deuteranopia diffs red and blue instead of yellow and blue:: +* Make the themes look like what the maintainer uses:: + +Face coverage + +* Supported packages:: Full list of covered face groups +* Indirectly covered packages:: + +Notes on individual packages + +* Note on calendar.el weekday and weekend colors: Note on calendarel weekday and weekend colors. +* Note on git-gutter in Doom Emacs:: +* Note on php-mode multiline comments:: +* Note on underlines in compilation buffers:: +* Note on inline Latex in Org buffers:: +* Note on dimmer.el: Note on dimmerel. +* Note on display-fill-column-indicator-mode:: +* Note on highlight-parentheses.el: Note on highlight-parenthesesel. +* Note on mmm-mode.el background colors: Note on mmm-modeel background colors. +* Note for prism:: +* Note on company-mode overlay pop-up:: +* Note on ERC escaped color sequences:: +* Note on powerline or spaceline:: +* Note on SHR colors:: +* Note on SHR fonts:: +* Note on Ement colors and fonts:: +* Note on pdf-tools link hints:: +* Note on the Notmuch logo:: +* Note on goto-address-mode faces:: + +Frequently Asked Questions + +* Is the contrast ratio about adjacent colors?:: +* What does it mean to avoid exaggerations?:: +* Why are colors mostly variants of blue, magenta, cyan?: Why are colors mostly variants of blue magenta cyan?. +* What is the best setup for legibility?:: +* Are these color schemes?:: +* Port the Modus themes to other platforms?:: + +Contributing + +* Sources of the themes:: +* Issues you can help with:: +* Patches require copyright assignment to the FSF:: + +Indices + +* Function index:: +* Variable index:: +* Concept index:: + + + +File: modus-themes.info, Node: Overview, Next: Installation, Prev: Top, Up: Top + +1 Overview +********** + +The Modus themes are designed for accessible readability. They conform +with the highest standard for color contrast between combinations of +background and foreground values. For small sized text, this +corresponds to the WCAG AAA standard, which specifies a minimum rate of +distance in relative luminance of 7:1. + + The Modus themes consist of eight themes, divided into four +subgroups. + +Main themes + ‘modus-operandi’ is the project’s main light theme, while + ‘modus-vivendi’ is its dark counterpart. These two themes are part + of the project since its inception. They are designed to cover a + broad range of needs and are, in the opinion of the author, the + reference for what a highly legible “default” theme should look + like. + +Tinted themes + ‘modus-operandi-tinted’ and ‘modus-vivendi-tinted’ are variants of + the two main themes. They slightly tone down the intensity of the + background and provide a bit more color variety. + ‘modus-operandi-tinted’ has a set of base tones that are shades of + light ochre (earthly colors), while ‘modus-vivendi-tinted’ gives a + night sky impression. + +Deuteranopia themes + ‘modus-operandi-deuteranopia’ and its companion + ‘modus-vivendi-deuteranopia’ are optimized for users with red-green + color deficiency. This means that they do not use red and green + hues for color-coding purposes, such as for diff removed and added + lines. Instead, they implement colors that are discernible by + users with deueteranopia or deuteranomaly (mostly yellow and blue + hues). + +Tritanopia themes + ‘modus-operandi-tritanopia’ and its counterpart + ‘modus-vivendi-tritanopia’ are optimized for users with blue-yellow + color deficiency. The idea is the same as with the deuteranopia + variants: color coding relies only on hues that are accessible to + people with tritanopia or tritanomaly, namely, shades of red and + cyan. + + To ensure that users have a consistently accessible experience, the +themes strive to achieve as close to full face coverage as possible, +while still targeting a curated list of well-maintained packages (*note +Face coverage::). + + The overarching objective of this project is to always offer +accessible color combinations. There shall never be a compromise on +this principle. If there arises an inescapable trade-off between +usability and stylistic considerations, we will always opt for the +former. + + Starting with version 0.12.0 and onwards, the themes are built into +GNU Emacs. + +* Menu: + +* How do the themes look like:: +* Learn about the latest changes:: + + +File: modus-themes.info, Node: How do the themes look like, Next: Learn about the latest changes, Up: Overview + +1.1 How do the themes look like +=============================== + +Check the web page with the screen shots +(https://protesilaos.com/emacs/modus-themes-pictures/). Note that the +themes are highly customizable (*note Customization options::). + + +File: modus-themes.info, Node: Learn about the latest changes, Prev: How do the themes look like, Up: Overview + +1.2 Learn about the latest changes +================================== + +Please refer to the web page with the change log +(https://protesilaos.com/emacs/modus-themes-changelog). It is +comprehensive and covers everything that goes into every tagged release +of the themes. + + +File: modus-themes.info, Node: Installation, Next: Enable and load, Prev: Overview, Up: Top + +2 Installation +************** + +The Modus themes are distributed with Emacs starting with version 28.1. +On older versions of Emacs, they can be installed using Emacs’ package +manager or manually from their code repository. There also exist +packages for distributions of GNU/Linux. + + Emacs 28 ships with ‘modus-themes’ version ‘1.6.0’. Emacs 29 +includes version ‘3.0.0’. Emacs 30 provides a newer, refactored version +that thoroughly refashions how the themes are implemented and +customized. Such major versions are not backward-compatible due to the +limited resources at the maintainer’s disposal to support multiple +versions of Emacs and of the themes across the years. + +* Menu: + +* Install manually from source:: +* Install from the archives:: +* Install on GNU/Linux:: +* Dealing with byte compilation errors:: + + +File: modus-themes.info, Node: Install manually from source, Next: Install from the archives, Up: Installation + +2.1 Install manually from source +================================ + +In the following example, we are assuming that your Emacs files are +stored in ‘~/.emacs.d’ and that you want to place the Modus themes in +‘~/.emacs.d/modus-themes’. + + 1. Get the source and store it in the desired path by running the + following in the command line shell: + + $ git clone https://gitlab.com/protesilaos/modus-themes.git ~/.emacs.d/modus-themes + + 1. Add that path to your known Elisp libraries’ list, by placing this + snippet of Emacs Lisp in your init file (e.g. ‘init.el’): + + (add-to-list 'load-path "~/.emacs.d/modus-themes") + + The themes are now ready to be used: *note Enable and load::. + + +File: modus-themes.info, Node: Install from the archives, Next: Install on GNU/Linux, Prev: Install manually from source, Up: Installation + +2.2 Install from the archives +============================= + +The ‘modus-themes’ package is available from the GNU ELPA archive, which +is configured by default. + + Prior to querying any package archive, make sure to update the index, +with ‘M-x package-refresh-contents’. Then all you need to do is type +‘M-x package-install’ and specify the ‘modus-themes’. + + Once installed, the themes are ready to be used: *note Enable and +load::. + + +File: modus-themes.info, Node: Install on GNU/Linux, Next: Dealing with byte compilation errors, Prev: Install from the archives, Up: Installation + +2.3 Install on GNU/Linux +======================== + +The themes are also available from the archives of some distributions of +GNU/Linux. These should correspond to a tagged release rather than +building directly from the latest Git commit. It all depends on the +distro’s packaging policies. + +* Menu: + +* Debian 11 Bullseye:: +* GNU Guix:: + + +File: modus-themes.info, Node: Debian 11 Bullseye, Next: GNU Guix, Up: Install on GNU/Linux + +2.3.1 Debian 11 Bullseye +------------------------ + +The themes are part of Debian 11 Bullseye. Get them with: + + sudo apt install elpa-modus-themes + + They are now ready to be used: *note Enable and load::. + + NOTE that Debian’s package is severely out-of-date as of this writing +2022-07-24 09:57 +0300. + + +File: modus-themes.info, Node: GNU Guix, Prev: Debian 11 Bullseye, Up: Install on GNU/Linux + +2.3.2 GNU Guix +-------------- + +Users of Guix can get the themes with this command: + + guix package -i emacs-modus-themes + + They are now ready to be used: *note Enable and load::. + + +File: modus-themes.info, Node: Dealing with byte compilation errors, Prev: Install on GNU/Linux, Up: Installation + +2.4 Dealing with byte compilation errors +======================================== + +From time to time, we receive bug reports pertaining to errors with byte +compilation. These seldom have to do with faulty code in the themes: it +might be a shortcoming of ‘package.el’, some regression in the current +development target of Emacs, a misconfiguration in an otherwise exotic +setup, and the like. + + The common solution with a stable version of Emacs is to: + + 1. Delete the ‘modus-themes’ package. + 2. Close the current Emacs session. + 3. Install the ‘modus-themes’ again. + + For those building Emacs directly from source, the solution may +involve reverting to an earlier commit in emacs.git. + + At any rate, if you encounter such an issue please report it: we will +either fix the bug on our end if it is truly ours, or help forward it to +the relevant upstream maintainer. Whatever you do, please understand +that a build failure does not mean we are necessarily doing something +wrong. + + *note Issues you can help with::. + + +File: modus-themes.info, Node: Enable and load, Next: Customization options, Prev: Installation, Up: Top + +3 Enable and load +***************** + +NOTE that Emacs can load multiple themes, which typically produces +undesirable results and undoes the work of the designer. Use the +‘disable-theme’ command if you are trying other themes beside the Modus +collection (*note Option for disabling other themes while loading Modus: +Disable other themes.). + + Users of the built-in themes cannot ‘require’ the package as usual +because there is no package to speak of. Instead, things are simpler as +built-in themes are considered safe. All one needs is to load the theme +of their preference by adding either form to their init file: + + (load-theme 'modus-operandi) ; Light theme + (load-theme 'modus-vivendi) ; Dark theme + + Remember that the Modus themes are six themes (*note Overview::). +Adapt the above snippet accordingly. + + Users of packaged variants of the themes must add a few more lines to +ensure that everything works as intended. First, one has to require the +main library before loading one of the themes: + + (require 'modus-themes) + + One can activate a theme with something like the following +expression, replacing ‘modus-operandi’ with their preferred Modus theme: + + (load-theme 'modus-operandi :no-confirm) + + Changes to the available customization options must always be +evaluated before loading a theme (*note Customization Options: +Customization options.). Reload a theme for new changes to take effect. + + This is how a basic setup could look like (*note The require-theme +for built-in Emacs themes: The require-theme for built-in Emacs +themes.): + + ;;; For the built-in themes which cannot use `require'. + (require-theme 'modus-themes) + + ;; Add all your customizations prior to loading the themes. + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Load the theme of your choice. + (load-theme 'modus-operandi) + + ;; Optionally define a key to switch between Modus themes. Also check + ;; the user option `modus-themes-to-toggle'. + (define-key global-map (kbd "<f5>") #'modus-themes-toggle) + + + + ;;; For packaged versions which must use `require'. + + (require 'modus-themes) + + ;; Add all your customizations prior to loading the themes + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Load the theme of your choice. + (load-theme 'modus-operandi :no-confirm) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle) + + *note Sample configuration with and without use-package::. + +* Menu: + +* The require-theme for built-in Emacs themes:: +* Sample configuration with and without use-package:: +* Differences between loading and enabling:: + + +File: modus-themes.info, Node: The require-theme for built-in Emacs themes, Next: Sample configuration with and without use-package, Up: Enable and load + +3.1 The ‘require-theme’ for built-in Emacs themes +================================================= + +The version of the Modus themes that is included in Emacs CANNOT use the +standard ‘require’. This is because the built-in themes are not +included in the ‘load-path’ (not my decision). The ‘require-theme’ +function must be used in this case as a replacement. For example: + + (require-theme 'modus-themes) + + ;; All customizations here + (setq modus-themes-bold-constructs t + modus-themes-italic-constructs t) + + ;; Maybe define some palette overrides, such as by using our presets + (setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + + ;; Load the theme of choice (built-in themes are always "safe" so they + ;; do not need the `no-require' argument of `load-theme'). + (load-theme 'modus-operandi) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle) + + +File: modus-themes.info, Node: Sample configuration with and without use-package, Next: Differences between loading and enabling, Prev: The require-theme for built-in Emacs themes, Up: Enable and load + +3.2 Sample configuration with and without use-package +===================================================== + +What follows is a variant of what we demonstrate in the previous section +(*note Enable and load::). + + It is common for Emacs users to rely on ‘use-package’ for declaring +package configurations in their setup. We use this as an example: + + ;;; For the built-in themes which cannot use `require'. + (use-package emacs + :config + (require-theme 'modus-themes) ; `require-theme' is ONLY for the built-in Modus themes + + ;; Add all your customizations prior to loading the themes + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Maybe define some palette overrides, such as by using our presets + (setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + + ;; Load the theme of your choice. + (load-theme 'modus-operandi) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle)) + + + + ;;; For packaged versions which must use `require'. + (use-package modus-themes + :ensure t + :config + ;; Add all your customizations prior to loading the themes + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Maybe define some palette overrides, such as by using our presets + (setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + + ;; Load the theme of your choice. + (load-theme 'modus-operandi) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle)) + + The same without ‘use-package’: + + (require 'modus-themes) ; OR for the built-in themes: (require-theme 'modus-themes) + + ;; Add all your customizations prior to loading the themes + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Maybe define some palette overrides, such as by using our presets + (setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + + ;; Load the theme of your choice: + (load-theme 'modus-operandi :no-confirm) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle) + + *note Differences between loading and enabling::. + + Note: make sure not to customize the variable +‘custom-theme-load-path’ or ‘custom-theme-directory’ after the themes’ +package declaration. That will lead to failures in loading the files. +If either or both of those variables need to be changed, their values +should be defined before the package declaration of the themes. + + *note Make the themes look like what the maintainer uses:: + + +File: modus-themes.info, Node: Differences between loading and enabling, Prev: Sample configuration with and without use-package, Up: Enable and load + +3.3 Differences between loading and enabling +============================================ + +The reason we recommend ‘load-theme’ instead of the other option of +‘enable-theme’ is that the former does a kind of “reset” on the face +specs. It quite literally loads (or reloads) the theme. Whereas the +‘enable-theme’ function simply puts an already loaded theme to the top +of the list of enabled items, re-using whatever state was last loaded. + + As such, ‘load-theme’ reads all customizations that may happen during +any given Emacs session: even after the initial setup of a theme. +Examples are calls to ‘custom-set-faces’, as well as new values assigned +to the options the Modus themes provide (*note Customization Options: +Customization options.). + + Our tests show that ‘enable-theme’ does not read such variables anew, +so it might appear to the unsuspecting user that the themes are somehow +broken whenever they try to assign a new value to a customization option +or some face. + + This “reset” that ‘load-theme’ brings about does, however, come at +the cost of being somewhat slower than ‘enable-theme’. Users who have a +stable setup and who seldom update their variables during a given Emacs +session, are better off using something like this: + + (require 'modus-themes) + + ;; Activate your desired themes here + (load-theme 'modus-operandi t t) + (load-theme 'modus-vivendi t t) + + ;; Enable the preferred one + (enable-theme 'modus-operandi) + + *note Toggle themes without reloading them::. + + *note Sample configuration with and without use-package::. + + With the above granted, other sections of the manual discuss how to +configure custom faces, where ‘load-theme’ is expected, though +‘enable-theme’ could still apply in stable setups: + + *note Use theme colors in code with modus-themes-with-colors::. + + +File: modus-themes.info, Node: Customization options, Next: Advanced customization, Prev: Enable and load, Up: Top + +4 Customization options +*********************** + +The Modus themes are highly configurable, though they should work well +without any further tweaks. We provide a variety of user options. The +following code block provides an overview. In addition to those +variables, the themes support a comprehensive system of overrides: it +can be used to make thoroughgoing changes to the looks of the themes +(*note Option for palette overrides: Palette overrides.). We document +everything at length in the pages of this manual and also provide +ready-to-use code samples. + + Remember that all customization options must be evaluated before +loading a theme (*note Enable and load::). If the theme is already +active, it must be reloaded for changes to take effect. + + ;; In all of the following, WEIGHT is a symbol such as `semibold', + ;; `light', `bold', or anything mentioned in `modus-themes-weights'. + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil + modus-themes-mixed-fonts t + modus-themes-variable-pitch-ui nil + modus-themes-custom-auto-reload t + modus-themes-disable-other-themes t + + ;; Options for `modus-themes-prompts' are either nil (the + ;; default), or a list of properties that may include any of those + ;; symbols: `italic', `WEIGHT' + modus-themes-prompts '(italic bold) + + ;; The `modus-themes-completions' is an alist that reads two + ;; keys: `matches', `selection'. Each accepts a nil value (or + ;; empty list) or a list of properties that can include any of + ;; the following (for WEIGHT read further below): + ;; + ;; `matches' :: `underline', `italic', `WEIGHT' + ;; `selection' :: `underline', `italic', `WEIGHT' + modus-themes-completions + '((matches . (extrabold)) + (selection . (semibold italic text-also))) + + modus-themes-org-blocks 'gray-background ; {nil,'gray-background,'tinted-background} + + ;; The `modus-themes-headings' is an alist: read the manual's + ;; node about it or its doc string. Basically, it supports + ;; per-level configurations for the optional use of + ;; `variable-pitch' typography, a height value as a multiple of + ;; the base font size (e.g. 1.5), and a `WEIGHT'. + modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (1.3)) + (agenda-date . (1.3)) + (agenda-structure . (variable-pitch light 1.8)) + (t . (1.1)))) + + ;; Remember that more (MUCH MORE) can be done with overrides, which we + ;; document extensively in this manual. + +* Menu: + +* Custom reload theme:: Toggle auto-reload of the theme when setting custom variables +* Disable other themes:: Determine whether loading a Modus themes disables all others +* Bold constructs:: Toggle bold constructs in code +* Italic constructs:: Toggle italic font constructs in code +* Mixed fonts:: Toggle mixing of font families +* Command prompts:: Control the style of command prompts +* Completion UIs:: Choose among several styles for completion UIs +* Org mode blocks:: Choose among plain, gray, or tinted backgrounds +* Heading styles:: Choose among several styles, also per heading level +* UI typeface:: Toggle the use of variable-pitch across the User Interface +* Palette overrides:: Refashion color values and/or semantic color mappings + + +File: modus-themes.info, Node: Custom reload theme, Next: Disable other themes, Up: Customization options + +4.1 Option for reloading the theme on custom change +=================================================== + +Brief: Toggle reloading of the active theme when an option is changed +through the Custom UI. + + Symbol: ‘modus-themes-custom-auto-reload’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ + 2. ‘t’ (default) + + All theme user options take effect when a theme is loaded. Any +subsequent changes require the theme to be reloaded. + + When this variable has a non-‘nil’ value, any change made via the +Custom UI or related functions such as ‘customize-set-variable’ and +‘setopt’ (Emacs 29), will trigger a reload automatically. + + With a ‘nil’ value, changes to user options have no further +consequences: the user must manually reload the theme (*note Enable and +load::). + + +File: modus-themes.info, Node: Disable other themes, Next: Bold constructs, Prev: Custom reload theme, Up: Customization options + +4.2 Option for disabling other themes while loading Modus +========================================================= + +Brief: Disable all other themes when loading a Modus theme. + + Symbol: ‘modus-themes-disable-other-themes’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ + 2. ‘t’ (default) + + When the value is non-‘nil’, the commands ‘modus-themes-toggle’ and +‘modus-themes-select’, as well as the ‘modus-themes-load-theme’ +function, will disable all other themes while loading the specified +Modus theme. This is done to ensure that Emacs does not blend two or +more themes: such blends lead to awkward results that undermine the work +of the designer. + + When the value is ‘nil’, the aforementioned commands and function +will only disable other themes within the Modus collection. + + This option is provided because Emacs themes are not necessarily +limited to colors/faces: they can consist of an arbitrary set of +customizations. Users who use such customization bundles must set this +variable to a ‘nil’ value. + + +File: modus-themes.info, Node: Bold constructs, Next: Italic constructs, Prev: Disable other themes, Up: Customization options + +4.3 Option for more bold constructs +=================================== + +Brief: Use bold for code syntax highlighting and related. + + Symbol: ‘modus-themes-bold-constructs’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ (default) + 2. ‘t’ + + The default is to use a bold typographic weight only when it is +required. + + With a non-‘nil’ value (‘t’) display several syntactic constructs in +bold weight. This concerns keywords and other important aspects of code +syntax. It also affects certain mode line indicators and command +prompts. + + Advanced users may also want to configure the exact attributes of the +‘bold’ face. + + *note Configure bold and italic faces::. + + +File: modus-themes.info, Node: Italic constructs, Next: Mixed fonts, Prev: Bold constructs, Up: Customization options + +4.4 Option for more italic constructs +===================================== + +Brief: Use italics for code syntax highlighting and related. + + Symbol: ‘modus-themes-italic-constructs’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ (default) + 2. ‘t’ + + The default is to not use slanted text forms (italics) unless it is +absolutely necessary. + + With a non-‘nil’ value (‘t’) choose to render more faces in italics. +This typically affects documentation strings and code comments. + + Advanced users may also want to configure the exact attributes of the +‘italic’ face. + + *note Configure bold and italic faces::. + + +File: modus-themes.info, Node: Mixed fonts, Next: Command prompts, Prev: Italic constructs, Up: Customization options + +4.5 Option for font mixing +========================== + +Brief: Toggle the use of monospaced fonts for spacing-sensitive +constructs (affects font families). + + Symbol: ‘modus-themes-mixed-fonts’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ (default) + 2. ‘t’ + + When set to non-‘nil’ (‘t’), configure some spacing-sensitive faces +like Org tables and code blocks to always inherit from the ‘fixed-pitch’ +face. This is to ensure that certain constructs like code blocks and +tables remain monospaced even when users opt for a mode that remaps +typeface families, such as the built-in ‘M-x variable-pitch-mode’. +Otherwise the layout can appear broken, due to how spacing is done. + + For a consistent experience, user may need to specify the font family +of the ‘fixed-pitch’ face. + + *note Font configurations for Org and others::. + + +File: modus-themes.info, Node: Command prompts, Next: Completion UIs, Prev: Mixed fonts, Up: Customization options + +4.6 Option for command prompt styles +==================================== + +Brief: Control the style of command prompts (e.g. minibuffer, shell, +IRC clients). + + Symbol: ‘modus-themes-prompts’ (‘choice’ type, list of properties) + + Possible values are expressed as a list of properties (default is +‘nil’ or an empty list). The list can include any of the following +symbols: + + • ‘italic’ + • ‘italic’ + • A font weight, which must be supported by the underlying typeface: + • ‘thin’ + • ‘ultralight’ + • ‘extralight’ + • ‘light’ + • ‘semilight’ + • ‘regular’ + • ‘medium’ + • ‘semibold’ + • ‘bold’ + • ‘heavy’ + • ‘extrabold’ + • ‘ultrabold’ + + The default (a ‘nil’ value or an empty list) means to only use a +subtle colored foreground color. + + The ‘italic’ property adds a slant to the font’s forms (italic or +oblique forms, depending on the typeface). + + The symbol of a font weight attribute such as ‘light’, ‘semibold’, et +cetera, adds the given weight to links. Valid symbols are defined in +the variable ‘modus-themes-weights’. The absence of a weight means that +the one of the underlying text will be used. + + Combinations of any of those properties are expressed as a list, like +in these examples: + + (bold italic) + (italic semibold) + + The order in which the properties are set is not significant. + + In user configuration files the form may look like this: + + (setq modus-themes-prompts '(extrabold italic)) + + *note Make prompts more or less colorful::. + + +File: modus-themes.info, Node: Completion UIs, Next: Org mode blocks, Prev: Command prompts, Up: Customization options + +4.7 Option for completion framework aesthetics +============================================== + +Brief: Set the overall style of completion framework interfaces. + + Symbol: ‘modus-themes-completions’ (‘alist’ type properties) + + This affects Company, Corfu, Flx, Icomplete/Fido, Ido, Ivy, +Orderless, Vertico, and the standard ‘*Completions*’ buffer. The value +is an alist of expressions, each of which takes the form of ‘(KEY . +LIST-OF-PROPERTIES)’. ‘KEY’ is a symbol, while ‘PROPERTIES’ is a list. +Here is a sample, followed by a description of the particularities: + + (setq modus-themes-completions + '((matches . (extrabold underline)) + (selection . (semibold italic)))) + + The ‘matches’ key refers to the highlighted characters that +correspond to the user’s input. When its properties are ‘nil’ or an +empty list, matching characters in the user interface will have a bold +weight and a colored foreground. The list of properties may include any +of the following symbols regardless of the order they may appear in: + + • ‘underline’ to draw a line below the characters; + + • ‘italic’ to use a slanted font (italic or oblique forms); + + • The symbol of a font weight attribute such as ‘light’, ‘semibold’, + et cetera. Valid symbols are defined in the variable + ‘modus-themes-weights’. The absence of a weight means that bold + will be used. + + The ‘selection’ key applies to the current line or currently matched +candidate, depending on the specifics of the user interface. When its +properties are ‘nil’ or an empty list, it has a subtle gray background, +a bold weight, and the base foreground value for the text. The list of +properties it accepts is as follows (order is not significant): + + • ‘underline’ to draw a line below the characters; + + • ‘italic’ to use a slanted font (italic or oblique forms); + + • The symbol of a font weight attribute such as ‘light’, ‘semibold’, + et cetera. Valid symbols are defined in the variable + ‘modus-themes-weights’. The absence of a weight means that bold + will be used. + + Apart from specifying each key separately, a catch-all list is +accepted. This is only useful when the desired aesthetic is the same +across all keys that are not explicitly referenced. For example, this: + + (setq modus-themes-completions + '((t . (extrabold underline)))) + + Is the same as: + + (setq modus-themes-completions + '((matches . (extrabold underline)) + (selection . (extrabold underline)))) + + *note Make completion matches more or less colorful::. + + +File: modus-themes.info, Node: Org mode blocks, Next: Heading styles, Prev: Completion UIs, Up: Customization options + +4.8 Option for org-mode block styles +==================================== + +Brief: Set the overall style of Org code blocks, quotes, and the like. + + Symbol: ‘modus-themes-org-blocks’ (‘choice’ type) + + Possible values: + + 1. ‘nil’ (default) + 2. ‘gray-background’ + 3. ‘tinted-background’ + + Option ‘nil’ (the default) means that the block has no background of +its own: it uses the one that applies to the rest of the buffer. In +this case, the delimiter lines have a gray color for their text, making +them look exactly like all other Org properties. + + Option ‘gray-background’ applies a subtle gray background to the +block’s contents. It also affects the begin and end lines of the block +as they get another shade of gray as their background, which +differentiates them from the contents of the block. All background +colors extend to the edge of the window, giving the area a rectangular, +“blocky” presentation. If the begin/end lines do not extend in this +way, check the value of the Org user option +‘org-fontify-whole-block-delimiter-line’. + + Option ‘tinted-background’ uses a colored background for the contents +of the block. The exact color value will depend on the programming +language and is controlled by the variable ‘org-src-block-faces’ (refer +to the theme’s source code for the current association list). For this +to take effect, the Org buffer needs to be restarted with +‘org-mode-restart’. + + Code blocks use their major mode’s fontification (syntax +highlighting) only when the variable ‘org-src-fontify-natively’ is +non-‘nil’. While quote/verse blocks require setting +‘org-fontify-quote-and-verse-blocks’ to a non-‘nil’ value. + + *note Update Org block delimiter fontification::. + + +File: modus-themes.info, Node: Heading styles, Next: UI typeface, Prev: Org mode blocks, Up: Customization options + +4.9 Option for the headings’ overall style +========================================== + +Brief: Heading styles with optional list of values per heading level. + + Symbol: ‘modus-themes-headings’ (‘alist’ type, multiple properties) + + This is an alist that accepts a ‘(KEY . LIST-OF-VALUES)’ combination. +The ‘KEY’ is either a number, representing the heading’s level (0 +through 8) or ‘t’, which pertains to the fallback style. The named keys +‘agenda-date’ and ‘agenda-structure’ apply to the Org agenda. + + Level 0 is a special heading: it is used for what counts as a +document title or equivalent, such as the ‘#+title’ construct we find in +Org files. Levels 1-8 are regular headings. + + The ‘LIST-OF-VALUES’ covers symbols that refer to properties, as +described below. Here is a complete sample with various stylistic +combinations, followed by a presentation of all available properties: + + (setq modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (1.3)) + (agenda-date . (1.3)) + (agenda-structure . (variable-pitch light 1.8)) + (t . (1.1)))) + + Properties: + + • A font weight, which must be supported by the underlying typeface: + • ‘thin’ + • ‘ultralight’ + • ‘extralight’ + • ‘light’ + • ‘semilight’ + • ‘regular’ + • ‘medium’ + • ‘semibold’ + • ‘bold’ (default) + • ‘heavy’ + • ‘extrabold’ + • ‘ultrabold’ + • A floating point as a height multiple of the default or a cons cell + in the form of ‘(height . FLOAT)’. + + By default (a ‘nil’ value for this variable), all headings have a +bold typographic weight and use a desaturated text color. + + A ‘variable-pitch’ property changes the font family of the heading to +that of the ‘variable-pitch’ face (normally a proportionately spaced +typeface). + + The symbol of a weight attribute adjusts the font of the heading +accordingly, such as ‘light’, ‘semibold’, etc. Valid symbols are +defined in the variable ‘modus-themes-weights’. The absence of a weight +means that bold will be used by virtue of inheriting the ‘bold’ face. + + *note Configure bold and italic faces::. + + A number, expressed as a floating point (e.g. 1.5), adjusts the +height of the heading to that many times the base font size. The +default height is the same as 1.0, though it need not be explicitly +stated. Instead of a floating point, an acceptable value can be in the +form of a cons cell like ‘(height . FLOAT)’ or ‘(height FLOAT)’, where +FLOAT is the given number. + + Combinations of any of those properties are expressed as a list, like +in these examples: + + (semibold) + (variable-pitch semibold 1.3) + (variable-pitch semibold (height 1.3)) ; same as above + (variable-pitch semibold (height . 1.3)) ; same as above + + The order in which the properties are set is not significant. + + In user configuration files the form may look like this: + + (setq modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (1.3)) + (agenda-date . (1.3)) + (agenda-structure . (variable-pitch light 1.8)) + (t . (1.1)))) + + When defining the styles per heading level, it is possible to pass a +non-‘nil’ value (‘t’) instead of a list of properties. This will retain +the original aesthetic for that level. For example: + + (setq modus-themes-headings + '((1 . t) ; keep the default style + (2 . (semibold 1.2)) + (t . (rainbow)))) ; style for all other headings + + (setq modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (semibold)) + (t . t))) ; default style for all other levels + + Note that the text color of headings, of their background, and +overline can all be set via the overrides. It is possible to have any +color combination for any heading level (something that could not be +done in older versions of the themes). + + *note Option for palette overrides: Palette overrides. + + *note Make headings more or less colorful::. + + +File: modus-themes.info, Node: UI typeface, Next: Palette overrides, Prev: Heading styles, Up: Customization options + +4.10 Option for variable-pitch font in UI elements +================================================== + +Brief: Toggle the use of proportionately spaced (‘variable-pitch’) fonts +in the User Interface. + + Symbol: ‘modus-themes-variable-pitch-ui’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ (default) + 2. ‘t’ + + This option concerns User Interface elements that are under the +direct control of Emacs. In particular: the mode line, header line, tab +bar, and tab line. + + The default is to use the same font as the rest of Emacs, which +usually is a monospaced family. + + With a non-‘nil’ value (‘t’) apply a proportionately spaced typeface. +This is done by assigning the ‘variable-pitch’ face to the relevant +items. + + *note Font configurations for Org and others::. + + +File: modus-themes.info, Node: Palette overrides, Prev: UI typeface, Up: Customization options + +4.11 Option for palette overrides +================================= + +This section describes palette overrides in detail. For a simpler +alternative, use the presets we provide (*note Palette override +presets::). + + Each Modus theme specifies a color palette that declares named color +values and semantic color mappings: + + • Named colors consist of a symbol and a string that specifies a + hexadecimal RGB value. For example: ‘(blue-warmer "#354fcf")’. + + • The semantic color mappings associate an abstract construct with a + given named color from the palette, like ‘(heading-2 + yellow-faint)’. Both elements of the list are symbols, though the + ‘cadr’ (value) can be a string that specifies a color, such as + ‘(heading-2 "#354fcf")’. + + Both of those subsets can be overridden, thus refashioning the theme. +Overrides are either shared, by being stored in the user option +‘modus-themes-common-palette-overrides’, or they are specific to the +theme they name. In the latter case, the naming scheme of each palette +variable is ‘THEME-NAME-palette-overrides’, thus yielding: + + • ‘modus-operandi-palette-overrides’ + + • ‘modus-operandi-deuteranopia-palette-overrides’ + + • ‘modus-operandi-tinted-palette-overrides’ + + • ‘modus-operandi-tritanopia-palette-overrides’ + + • ‘modus-vivendi-palette-overrides’ + + • ‘modus-vivendi-deuteranopia-palette-overrides’ + + • ‘modus-vivendi-tinted-palette-overrides’ + + • ‘modus-vivendi-tritanopia-palette-overrides’ + + Theme-specific overrides take precedence over the shared ones. It is +strongly advised that shared overrides do NOT alter color values, as +those will not be appropriate for both dark and light themes. Common +overrides are best limited to the semantic color mappings as those use +the color value that corresponds to the active theme (e.g. make the +cursor ‘blue-warmer’ in all themes, whatever the value of ‘blue-warmer’ +is in each theme). + + The value of any overrides’ variable must mirror a theme’s palette. +Palette variables are named after their theme as ‘THEME-NAME-palette’. +For example, the ‘modus-operandi-palette’ is like this: + + (defconst modus-operandi-palette + '( + ;;; Basic values + + (bg-main "#ffffff") + (bg-dim "#f0f0f0") + (fg-main "#000000") + + ;; ... + + (red "#a60000") + (red-warmer "#972500") + (red-cooler "#a0132f") + (red-faint "#7f0000") + (red-intense "#d00000") + + ;; ... + + ;;;; Mappings + + ;; ... + + (cursor fg-main) + (builtin magenta-warmer) + (comment fg-dim) + (constant blue-cooler) + (docstring green-faint) + (fnname magenta) + (keyword magenta-cooler) + + ;; ... + )) + + The ‘modus-operandi-palette-overrides’ targets the entries that need +to be changed. For example, to make the main foreground color a dark +gray instead of pure black, use a shade of red for comments, and apply a +cyan hue to keywords: + + (setq modus-operandi-palette-overrides + '((fg-main "#333333") + (comment red-faint) + (keyword cyan-cooler))) + + Changes take effect upon theme reload (*note Custom reload theme::). +Overrides are removed by setting their variable to a ‘nil’ value. + + The common accented foregrounds in each palette follow a predictable +naming scheme: ‘HUE{,-warmer,-cooler,-faint,-intense}’. ‘HUE’ is one of +the six basic colors: red, green, blue, yellow, magenta, cyan. + + Named colors that are meant to be used as backgrounds contain ‘bg’ in +their name, such as ‘bg-red-intense’. While special purpose foregrounds +that are meant to be combined with such backgrounds, contain ‘fg’ in +their name, such as ‘fg-removed’ which complements ‘bg-removed’. + + Named colors can be previewed, such as with the command +‘modus-themes-list-colors’ (*note Preview theme colors::). + + For a video tutorial that users of all skill levels can approach, +watch: +<https://protesilaos.com/codelog/2022-12-17-modus-themes-v4-demo/>. + + +File: modus-themes.info, Node: Advanced customization, Next: Face coverage, Prev: Customization options, Up: Top + +5 Advanced customization +************************ + +Unlike the predefined customization options which follow a clear pattern +of allowing the user to quickly specify their preference, the themes +also provide a more flexible, albeit difficult, mechanism to control +things with precision (*note Customization Options: Customization +options.). + + This section is of interest only to users who are prepared to +maintain their own local tweaks and who are willing to deal with any +possible incompatibilities between versioned releases of the themes. As +such, they are labeled as “do-it-yourself” or “DIY”. + +* Menu: + +* Palette override presets:: +* Stylistic variants using palette overrides:: +* More accurate colors in terminal emulators:: +* Range of color with terminal emulators:: +* Preview theme colors:: +* Per-theme customization settings:: +* Get a single color from the palette:: +* Use theme colors in code with modus-themes-with-colors:: +* Do not extend the region background:: +* Add padding to mode line:: +* Remap face with local value:: +* Font configurations for Org and others:: +* Configure bold and italic faces:: +* Custom Org todo keyword and priority faces:: +* Custom Org emphasis faces:: +* Update Org block delimiter fontification:: +* Measure color contrast:: +* Load theme depending on time of day:: +* Backdrop for pdf-tools:: +* Toggle themes without reloading them:: +* A theme-agnostic hook for theme loading:: +* Use more spacious margins or padding in Emacs frames:: +* Custom hl-todo colors:: +* Add support for solaire-mode:: + + +File: modus-themes.info, Node: Palette override presets, Next: Stylistic variants using palette overrides, Up: Advanced customization + +5.1 Palette override presets +============================ + +This section shows how to refashion the themes by opting in to the +stylistic presets we provide. Those presets override the default color +mappings to amplify, tone down, or refashion the overall coloration of +the themes. + + To make almost all aspects of the themes less intense, use this: + + ;; Always remember to reload the theme for changes to take effect! + (setq modus-themes-common-palette-overrides modus-themes-preset-overrides-faint) + + With ‘modus-themes-preset-overrides-faint’ the grays are toned down, +gray backgrounds are removed from some contexts, and almost all accent +colors are desaturated. It makes the themes less attention-grabbing. + + On the opposite end of the stylistic spectrum, we have this + + ;; Always remember to reload the theme for changes to take effect! + (setq modus-themes-common-palette-overrides modus-themes-preset-overrides-intense) + + The ‘modus-themes-preset-overrides-intense’ makes many background +colors accented instead of gray and increases coloration in a number of +places. Colors stand out more and are made easier to spot. + + For some stylistic variation try the “cooler” and “warmer” presets: + + ;; This: + (setq modus-themes-common-palette-overrides modus-themes-preset-overrides-cooler) + + ;; Or: + (setq modus-themes-common-palette-overrides modus-themes-preset-overrides-warmer) + + Note that the user is not limited to those presets. The system of +overrides we provide makes it possible to tweak the value of each +individual named color and to change how values are assigned to semantic +color mappings (*note Option for palette overrides: Palette overrides.). +Subsequent sections provide examples (*note Stylistic variants using +palette overrides::). + + It is also possible to use those presets as a basis and, for example, +add to them code from the subsequent sections of this manual. This is +the general idea (extra space for didactic purposes): + + (setq modus-themes-common-palette-overrides + `( + ;; From the section "Make the mode line borderless" + (border-mode-line-active unspecified) + (border-mode-line-inactive unspecified) + + ;; From the section "Make matching parenthesis more or less intense" + (bg-paren-match bg-magenta-intense) + (underline-paren-match fg-main) + + ;; And expand the preset here. Note that the ,@ works because + ;; we use the backtick for this list, instead of a straight + ;; quote. + ,@modus-themes-preset-overrides-intense)) + + +File: modus-themes.info, Node: Stylistic variants using palette overrides, Next: More accurate colors in terminal emulators, Prev: Palette override presets, Up: Advanced customization + +5.2 Stylistic variants using palette overrides +============================================== + +This section contains practical examples of overriding the palette of +the themes (*note Option for palette overrides: Palette overrides.). +Users can copy the code to their init file, evaluate it, and then +re-load the theme for changes to take effect. To apply overrides at +startup simply define them before the call that loads the theme. +Remember that we also provide presets that are easier to apply (*note +Palette override presets::). + +* Menu: + +* Make the mode line borderless:: +* Make the active mode line colorful:: +* Make the tab bar more or less colorful:: +* Make the fringe invisible or another color:: +* Make links use subtle or no underlines:: +* Make prompts more or less colorful:: +* Make completion matches more or less colorful:: +* Make comments yellow and strings green:: +* Make code syntax use the old alt-syntax style:: +* Make use of alternative styles for code syntax:: +* Make matching parenthesis more or less intense:: +* Make box buttons more or less gray:: +* Make TODO and DONE more or less intense:: +* Make headings more or less colorful:: +* Make Org agenda more or less colorful:: +* Make inline code in prose use alternative styles:: +* Make mail citations and headers more or less colorful:: +* Make the region preserve text colors, plus other styles: Make the region preserve text colors plus other styles. +* Make mouse highlights more or less colorful:: +* Make language underlines less colorful:: +* Make line numbers use alternative styles:: +* Make diffs use only a foreground:: +* Make deuteranopia diffs red and blue instead of yellow and blue:: +* Make the themes look like what the maintainer uses:: + + +File: modus-themes.info, Node: Make the mode line borderless, Next: Make the active mode line colorful, Up: Stylistic variants using palette overrides + +5.2.1 Make the mode line borderless +----------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +To hide the border around the active and inactive mode lines, we need to +set their color to that of the underlying background. + + *note Make the active mode line colorful::. + + *note Add padding to mode line::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Remove the border + (setq modus-themes-common-palette-overrides + '((border-mode-line-active unspecified) + (border-mode-line-inactive unspecified))) + + ;; Keep the border but make it the same color as the background of the + ;; mode line (thus appearing borderless). The difference with the + ;; above is that this version is a bit thicker because the border are + ;; still there. + (setq modus-themes-common-palette-overrides + '((border-mode-line-active bg-mode-line-active) + (border-mode-line-inactive bg-mode-line-inactive))) + + +File: modus-themes.info, Node: Make the active mode line colorful, Next: Make the tab bar more or less colorful, Prev: Make the mode line borderless, Up: Stylistic variants using palette overrides + +5.2.2 Make the active mode line colorful +---------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show some snippets that apply different stylistic variants. Of +course, it is possible to use theme-specific overrides to, say, have a +blue mode line for ‘modus-operandi’ and a red one for ‘modus-vivendi’. + + *note Make the mode line borderless::. + + *note Add padding to mode line::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Blue background, neutral foreground, intense blue border + (setq modus-themes-common-palette-overrides + '((bg-mode-line-active bg-blue-intense) + (fg-mode-line-active fg-main) + (border-mode-line-active blue-intense))) + + ;; Subtle blue background, neutral foreground, intense blue border + (setq modus-themes-common-palette-overrides + '((bg-mode-line-active bg-blue-subtle) + (fg-mode-line-active fg-main) + (border-mode-line-active blue-intense))) + + ;; Subtle red background, red foreground, invisible border + (setq modus-themes-common-palette-overrides + '((bg-mode-line-active bg-red-subtle) + (fg-mode-line-active red-warmer) + (border-mode-line-active bg-red-subtle))) + + +File: modus-themes.info, Node: Make the tab bar more or less colorful, Next: Make the fringe invisible or another color, Prev: Make the active mode line colorful, Up: Stylistic variants using palette overrides + +5.2.3 Make the tab bar more or less colorful +-------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to affect the colors of the built-in ‘tab-bar-mode’ and +‘tab-line-mode’. + + For consistent theme-wide results, consider changing the mode line, +fringes, and line numbers. These are shown in other sections of this +manual. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Make the `tab-bar-mode' mode subtle while keepings its original + ;; gray aesthetic. + (setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-main) + (bg-tab-current bg-active) + (bg-tab-other bg-dim))) + + ;; Like the above, but the current tab has a colorful background and + ;; the inactive tabs have a slightly more noticeable gray background. + (setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-main) + (bg-tab-current bg-cyan-intense) + (bg-tab-other bg-inactive))) + + ;; Make the tabs colorful, using a monochromatic pattern (e.g. shades + ;; of cyan). + (setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-cyan-nuanced) + (bg-tab-current bg-cyan-intense) + (bg-tab-other bg-cyan-subtle))) + + ;; Like the above, but with a dichromatic pattern (cyan and magenta). + (setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-cyan-nuanced) + (bg-tab-current bg-magenta-intense) + (bg-tab-other bg-cyan-subtle))) + + +File: modus-themes.info, Node: Make the fringe invisible or another color, Next: Make links use subtle or no underlines, Prev: Make the tab bar more or less colorful, Up: Stylistic variants using palette overrides + +5.2.4 Make the fringe invisible or another color +------------------------------------------------ + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to make the fringe invisible or how to assign to it a +different color. The “fringe” is a small area to the right and left +side of the Emacs window which shows indicators such as for truncation +or continuation lines. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Make the fringe invisible + (setq modus-themes-common-palette-overrides + '((fringe unspecified))) + + ;; Make the fringe more intense + (setq modus-themes-common-palette-overrides + '((fringe bg-active))) + + ;; Make the fringe colorful, but nuanced + (setq modus-themes-common-palette-overrides + '((fringe bg-blue-nuanced))) + + +File: modus-themes.info, Node: Make links use subtle or no underlines, Next: Make prompts more or less colorful, Prev: Make the fringe invisible or another color, Up: Stylistic variants using palette overrides + +5.2.5 Make links use subtle or no underlines +-------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this example, we showcase the special use of the ‘unspecified’ symbol +that underline mappings can read correctly. + + ;; Subtle underlines + (setq modus-themes-common-palette-overrides + '((underline-link border) + (underline-link-visited border) + (underline-link-symbolic border))) + + ;; No underlines + (setq modus-themes-common-palette-overrides + '((underline-link unspecified) + (underline-link-visited unspecified) + (underline-link-symbolic unspecified))) + + +File: modus-themes.info, Node: Make prompts more or less colorful, Next: Make completion matches more or less colorful, Prev: Make links use subtle or no underlines, Up: Stylistic variants using palette overrides + +5.2.6 Make prompts more or less colorful +---------------------------------------- + +This section contains practical examples of overriding the palette of +the themes (*note Option for palette overrides: Palette overrides.). In +the following code block we show how to add or remove color from +prompts. + + *note Option for command prompt styles: Command prompts. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Keep the background unspecified (like the default), but use a faint + ;; foreground color. + (setq modus-themes-common-palette-overrides + '((fg-prompt cyan-faint) + (bg-prompt unspecified))) + + ;; Add a nuanced background to prompts that complements their foreground. + (setq modus-themes-common-palette-overrides + '((fg-prompt cyan) + (bg-prompt bg-cyan-nuanced))) + + ;; Add a yellow background and adjust the foreground accordingly. + (setq modus-themes-common-palette-overrides + '((fg-prompt fg-main) + (bg-prompt bg-yellow-subtle))) ; try to replace "subtle" with "intense" + + +File: modus-themes.info, Node: Make completion matches more or less colorful, Next: Make comments yellow and strings green, Prev: Make prompts more or less colorful, Up: Stylistic variants using palette overrides + +5.2.7 Make completion matches more or less colorful +--------------------------------------------------- + +This section contains practical examples of overriding the palette of +the themes (*note Option for palette overrides: Palette overrides.). +Here we demonstrate how to activate background coloration for completion +matches. We show three different degrees of intensity. + + *note Option for completion framework aesthetics: Completion UIs. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Add a nuanced background color to completion matches, while keeping + ;; their foreground intact (foregrounds do not need to be specified in + ;; this case, but we do it for didactic purposes). + (setq modus-themes-common-palette-overrides + '((fg-completion-match-0 blue) + (fg-completion-match-1 magenta-warmer) + (fg-completion-match-2 cyan) + (fg-completion-match-3 red) + (bg-completion-match-0 bg-blue-nuanced) + (bg-completion-match-1 bg-magenta-nuanced) + (bg-completion-match-2 bg-cyan-nuanced) + (bg-completion-match-3 bg-red-nuanced))) + + ;; Add intense background colors to completion matches and adjust the + ;; foregrounds accordingly. + (setq modus-themes-common-palette-overrides + '((fg-completion-match-0 fg-main) + (fg-completion-match-1 fg-main) + (fg-completion-match-2 fg-main) + (fg-completion-match-3 fg-main) + (bg-completion-match-0 bg-blue-intense) + (bg-completion-match-1 bg-yellow-intense) + (bg-completion-match-2 bg-cyan-intense) + (bg-completion-match-3 bg-red-intense))) + + ;; Like the above, but with subtle backgrounds. + (setq modus-themes-common-palette-overrides + '((fg-completion-match-0 fg-main) + (fg-completion-match-1 fg-main) + (fg-completion-match-2 fg-main) + (fg-completion-match-3 fg-main) + (bg-completion-match-0 bg-blue-subtle) + (bg-completion-match-1 bg-yellow-subtle) + (bg-completion-match-2 bg-cyan-subtle) + (bg-completion-match-3 bg-red-subtle))) + + Adding to the above, it is possible to, say, reduce the number of +colors to two: + + ;; No backgrounds (like the default) and just use two colors. + (setq modus-themes-common-palette-overrides + '((fg-completion-match-0 blue) + (fg-completion-match-1 yellow) + (fg-completion-match-2 blue) + (fg-completion-match-3 yellow) + (bg-completion-match-0 unspecified) + (bg-completion-match-1 unspecified) + (bg-completion-match-2 unspecified) + (bg-completion-match-3 unspecified))) + + ;; Again, a two-color style but this time with backgrounds + (setq modus-themes-common-palette-overrides + '((fg-completion-match-0 blue) + (fg-completion-match-1 yellow) + (fg-completion-match-2 blue) + (fg-completion-match-3 yellow) + (bg-completion-match-0 bg-blue-nuanced) + (bg-completion-match-1 bg-yellow-nuanced) + (bg-completion-match-2 bg-blue-nuanced) + (bg-completion-match-3 bg-yellow-nuanced))) + + The user can mix and match to their liking. + + +File: modus-themes.info, Node: Make comments yellow and strings green, Next: Make code syntax use the old alt-syntax style, Prev: Make completion matches more or less colorful, Up: Stylistic variants using palette overrides + +5.2.8 Make comments yellow and strings green +-------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In previous versions of the themes, we provided an option for yellow-ish +comments and green-ish strings. For some users, those were still not +good enough, as the exact values were hardcoded. Here we show how to +reproduce the effect, but also how to tweak it to one’s liking. + + *note Make code syntax use the old alt-syntax style::. + + *note Make use of alternative styles for code syntax::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Yellow comments and green strings like older versions of the Modus + ;; themes + (setq modus-themes-common-palette-overrides + '((comment yellow-cooler) + (string green-cooler))) + + ;; Faint yellow comments and a different shade of green for strings + (setq modus-themes-common-palette-overrides + '((comment yellow-faint) + (string green-warmer))) + + ;; Green comments and yellow strings, because now the user has the + ;; freedom to do it + (setq modus-themes-common-palette-overrides + '((comment green) + (string yellow-cooler))) + + +File: modus-themes.info, Node: Make code syntax use the old alt-syntax style, Next: Make use of alternative styles for code syntax, Prev: Make comments yellow and strings green, Up: Stylistic variants using palette overrides + +5.2.9 Make code syntax use the old alt-syntax style +--------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this section we show how to reproduce what previous versions of the +Modus themes provided as a stylistic alternative for code syntax. The +upside of using overrides for this purpose is that we can tweak the +style to our liking, but first let’s start with its recreation: + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; The old "alt-syntax" + (setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment fg-dim) + (constant magenta-cooler) + (docstring magenta-faint) + (docmarkup green-faint) + (fnname magenta-warmer) + (keyword cyan) + (preprocessor cyan-cooler) + (string red-cooler) + (type magenta-cooler) + (variable blue-warmer) + (rx-construct magenta-warmer) + (rx-backslash blue-cooler))) + + The “alt-syntax” could optionally use green strings and yellow +comments (*note Make comments yellow and strings green::): + + ;; Same as above, but with yellow comments and green strings + (setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment yellow-faint) + (constant magenta-cooler) + (docstring green-faint) + (docmarkup magenta-faint) + (fnname magenta-warmer) + (keyword cyan) + (preprocessor cyan-cooler) + (string green-cooler) + (type magenta-cooler) + (variable blue-warmer) + (rx-construct magenta-warmer) + (rx-backslash blue-cooler))) + + The standard “alt-syntax” has red strings. As such, it is +interesting to experiment with faintly red colored comments: + + ;; Like the old "alt-syntax" but with faint red comments + (setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment red-faint) + (constant magenta-cooler) + (docstring magenta-faint) + (docmarkup green-faint) + (fnname magenta-warmer) + (keyword cyan) + (preprocessor cyan-cooler) + (string red-cooler) + (type magenta-cooler) + (variable blue-warmer) + (rx-construct magenta-warmer) + (rx-backslash blue-cooler))) + + The user can always mix and match styles to their liking. + + *note Make use of alternative styles for code syntax::. + + +File: modus-themes.info, Node: Make use of alternative styles for code syntax, Next: Make matching parenthesis more or less intense, Prev: Make code syntax use the old alt-syntax style, Up: Stylistic variants using palette overrides + +5.2.10 Make use of alternative styles for code syntax +----------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +The idea here is to change how named colors are mapped to code syntax. +Each of the following snippets give the ‘modus-themes’ a different feel +while editing code. + + Note that my ‘modus-themes’ and ‘ef-themes’ do not use the same +palettes, so some things are different. If you copy from the latter to +the former, double-check that the entries exist in the given Modus theme +palette. + + *note Make comments yellow and strings green::. + + *note Make code syntax use the old alt-syntax style::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Mimic `ef-night' theme (from my `ef-themes') for code syntax + ;; highlighting, while still using the Modus colors (and other + ;; mappings). + (setq modus-themes-common-palette-overrides + '((builtin green-cooler) + (comment yellow-faint) + (constant magenta-cooler) + (fnname cyan-cooler) + (keyword blue-warmer) + (preprocessor red-warmer) + (docstring cyan-faint) + (string blue-cooler) + (type magenta-cooler) + (variable cyan))) + + ;; Mimic `ef-summer' theme (from my `ef-themes') for code syntax + ;; highlighting, while still using the Modus colors (and other + ;; mappings). + (setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment yellow-faint) + (constant red-cooler) + (fnname magenta-warmer) + (keyword magenta-cooler) + (preprocessor green-warmer) + (docstring cyan-faint) + (string yellow-warmer) + (type cyan-warmer) + (variable blue-warmer))) + + ;; Mimic `ef-bio' theme (from my `ef-themes') for code syntax + ;; highlighting, while still using the Modus colors (and other + ;; mappings). + (setq modus-themes-common-palette-overrides + '((builtin green) + (comment yellow-faint) + (constant blue) + (fnname green-warmer) + (keyword green-cooler) + (preprocessor green) + (docstring green-faint) + (string magenta-cooler) + (type cyan-warmer) + (variable blue-warmer))) + + ;; Mimic `ef-trio-light' theme (from my `ef-themes') for code syntax + ;; highlighting, while still using the Modus colors (and other + ;; mappings). + (setq modus-themes-common-palette-overrides + '((builtin magenta-cooler) + (comment yellow-faint) + (constant magenta-warmer) + (fnname blue-warmer) + (keyword magenta) + (preprocessor red-cooler) + (docstring magenta-faint) + (string green-cooler) + (type cyan-cooler) + (variable cyan-warmer))) + + +File: modus-themes.info, Node: Make matching parenthesis more or less intense, Next: Make box buttons more or less gray, Prev: Make use of alternative styles for code syntax, Up: Stylistic variants using palette overrides + +5.2.11 Make matching parenthesis more or less intense +----------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this code block we show how to change the background of matching +delimiters when ‘show-paren-mode’ is enabled. We also demonstrate how +to enable underlines for those highlights. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Change the background to a shade of magenta + (setq modus-themes-common-palette-overrides + '((bg-paren-match bg-magenta-intense))) + + ;; Enable underlines by applying a color to them + (setq modus-themes-common-palette-overrides + '((bg-paren-match bg-magenta-intense) + (underline-paren-match fg-main))) + + +File: modus-themes.info, Node: Make box buttons more or less gray, Next: Make TODO and DONE more or less intense, Prev: Make matching parenthesis more or less intense, Up: Stylistic variants using palette overrides + +5.2.12 Make box buttons more or less gray +----------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +By default, the boxed buttons that appear in ‘M-x customize’ and related +are distinct shades of gray. The following set of overrides removes the +gray from the active buttons and amplifies it for the inactive ones. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + (setq modus-themes-common-palette-overrides + '((bg-button-active bg-main) + (fg-button-active fg-main) + (bg-button-inactive bg-inactive) + (fg-button-inactive "gray50"))) + + +File: modus-themes.info, Node: Make TODO and DONE more or less intense, Next: Make headings more or less colorful, Prev: Make box buttons more or less gray, Up: Stylistic variants using palette overrides + +5.2.13 Make TODO and DONE more or less intense +---------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to affect just the ‘TODO’ and ‘DONE’ keywords that we +encounter in Org buffers. The idea is to make those pop out more or to +subdue them. + + *note Make headings more or less colorful::. + + *note Make inline code in prose use alternative styles::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Increase intensity + (setq modus-themes-common-palette-overrides + '((prose-done green-intense) + (prose-todo red-intense))) + + ;; Tone down intensity + (setq modus-themes-common-palette-overrides + '((prose-done green-faint) ; OR replace `green-faint' with `olive' + (prose-todo red-faint))) ; OR replace `red-faint' with `rust' + + ;; Keep TODO at its default (so no override for it), but make DONE + ;; gray. + (setq modus-themes-common-palette-overrides + '((prose-done fg-dim))) + + +File: modus-themes.info, Node: Make headings more or less colorful, Next: Make Org agenda more or less colorful, Prev: Make TODO and DONE more or less intense, Up: Stylistic variants using palette overrides + +5.2.14 Make headings more or less colorful +------------------------------------------ + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to alter the looks of headings, such as in Org mode. +Using overrides here offers far more flexibility than what we could +achieve with previous versions of the themes: the user can mix and match +styles at will. + + *note Make TODO and DONE more intense: Make TODO and DONE more or +less intense. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Apply more colorful foreground to some headings (headings 0-8). + ;; Level 0 is for Org #+title and related. + (setq modus-themes-common-palette-overrides + '((fg-heading-1 blue-warmer) + (fg-heading-2 yellow-cooler) + (fg-heading-3 cyan-cooler))) + + ;; Like the above, but with gradient colors + (setq modus-themes-common-palette-overrides + '((fg-heading-1 blue) + (fg-heading-2 cyan) + (fg-heading-3 green))) + + ;; Add color to level 1 heading, but use the main foreground for + ;; others + (setq modus-themes-common-palette-overrides + '((fg-heading-1 blue) + (fg-heading-2 fg-main) + (fg-heading-3 fg-main))) + + ;; Apply colorful foreground, background, and overline (headings 0-8) + (setq modus-themes-common-palette-overrides + '((fg-heading-1 blue-warmer) + (bg-heading-1 bg-blue-nuanced) + (overline-heading-1 blue))) + + ;; Apply gray scale foreground, background, and overline (headings 0-8) + (setq modus-themes-common-palette-overrides + '((fg-heading-1 fg-main) + (bg-heading-1 bg-dim) + (overline-heading-1 border))) + + +File: modus-themes.info, Node: Make Org agenda more or less colorful, Next: Make inline code in prose use alternative styles, Prev: Make headings more or less colorful, Up: Stylistic variants using palette overrides + +5.2.15 Make Org agenda more or less colorful +-------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we provide three distinct code blocks. The first adds alternative +and more varied colors to the Org agenda (and related). The second uses +faint coloration. The third makes the agenda use various shades of +blue. Mix and match at will, while also combining these styles with +what we show in the other chapters with practical stylistic variants. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Make the Org agenda use alternative and varied colors. + (setq modus-themes-common-palette-overrides + '((date-common cyan) ; default value (for timestamps and more) + (date-deadline red-warmer) + (date-event magenta-warmer) + (date-holiday blue) ; for M-x calendar + (date-now yellow-warmer) + (date-scheduled magenta-cooler) + (date-weekday cyan-cooler) + (date-weekend blue-faint))) + + An example with faint coloration: + + ;; Make the Org agenda use faint colors. + (setq modus-themes-common-palette-overrides + '((date-common cyan-faint) ; for timestamps and more + (date-deadline red-faint) + (date-event fg-alt) ; default + (date-holiday magenta) ; default (for M-x calendar) + (date-now fg-main) ; default + (date-scheduled yellow-faint) + (date-weekday fg-dim) + (date-weekend fg-dim))) + + A third example that makes the agenda more blue: + + ;; Make the Org agenda use more blue instead of yellow and red. + (setq modus-themes-common-palette-overrides + '((date-common cyan) ; default value (for timestamps and more) + (date-deadline blue-cooler) + (date-event blue-faint) + (date-holiday blue) ; for M-x calendar + (date-now blue-faint) + (date-scheduled blue) + (date-weekday fg-main) + (date-weekend fg-dim))) + + Yet another example that also affects ‘DONE’ and ‘TODO’ keywords: + + ;; Change dates to a set of more subtle combinations. Deadlines are a + ;; shade of magenta, scheduled dates are a shade of green that + ;; complements that of the deadlines, weekday headings use the main + ;; foreground color while weekends are a shade of gray. The DONE + ;; keyword is a faint blue-gray while TODO is yellow. + (setq modus-themes-common-palette-overrides + '((date-deadline magenta-warmer) + (date-scheduled green-cooler) + (date-weekday fg-main) + (date-event fg-dim) + (date-now blue) + (prose-done fg-alt) + (prose-todo yellow))) + + +File: modus-themes.info, Node: Make inline code in prose use alternative styles, Next: Make mail citations and headers more or less colorful, Prev: Make Org agenda more or less colorful, Up: Stylistic variants using palette overrides + +5.2.16 Make inline code in prose use alternative styles +------------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In the following code block we show how to affect constructs such as +Org’s verbatim, code, and macro entries. We also provide mappings for +tables, property drawers, tags, and code block delimiters, though we do +not show every possible permutation. + + *note Make TODO and DONE more or less intense::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; These are all the mappings at their default values for didactic + ;; purposes + (setq modus-themes-common-palette-overrides + '((prose-block fg-dim) + (prose-code green-cooler) + (prose-done green) + (prose-macro magenta-cooler) + (prose-metadata fg-dim) + (prose-metadata-value fg-alt) + (prose-table fg-alt) + (prose-tag magenta-faint) + (prose-todo red) + (prose-verbatim magenta-warmer))) + + ;; Make code block delimiters use a shade of red, tone down verbatim, + ;; code, and macro, and amplify the style of property drawers + (setq modus-themes-common-palette-overrides + '((prose-block red-faint) + (prose-code fg-dim) + (prose-macro magenta-faint) + (prose-metadata cyan) + (prose-metadata-value green-warmer) + (prose-verbatim fg-dim))) + + ;; Like the above but with more color variety for the inline code + ;; elements + (setq modus-themes-common-palette-overrides + '((prose-block red-faint) + (prose-code blue-cooler) + (prose-macro yellow-warmer) + (prose-metadata cyan) + (prose-metadata-value green-warmer) + (prose-verbatim red-warmer))) + + +File: modus-themes.info, Node: Make mail citations and headers more or less colorful, Next: Make the region preserve text colors plus other styles, Prev: Make inline code in prose use alternative styles, Up: Stylistic variants using palette overrides + +5.2.17 Make mail citations and headers more or less colorful +------------------------------------------------------------ + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this section we show how to change the coloration of email message +headers and citations. Before we show the code, this is the anatomy of +a message: + + From: Protesilaos <info@protesilaos.com> + To: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> + Subject: Test subject + --- Headers above this line; message and citations below --- + This is some sample text + + > > Older quote + > Newer quote + + We thus have the following: + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Reduce the intensity of mail citations and headers + (setq modus-themes-common-palette-overrides + '((mail-cite-0 cyan-faint) + (mail-cite-1 yellow-faint) + (mail-cite-2 green-faint) + (mail-cite-3 red-faint) + (mail-part olive) + (mail-recipient indigo) + (mail-subject maroon) + (mail-other slate))) + + ;; Make mail citations more intense; adjust the headers accordingly + (setq modus-themes-common-palette-overrides + '((mail-cite-0 blue) + (mail-cite-1 yellow) + (mail-cite-2 green) + (mail-cite-3 magenta) + (mail-part magenta-cooler) + (mail-recipient cyan) + (mail-subject red-warmer) + (mail-other cyan-cooler))) + + ;; Make all citations faint and neutral; make most headers green but + ;; use red for the subject lie so that it stands out + (setq modus-themes-common-palette-overrides + '((mail-cite-0 fg-dim) + (mail-cite-1 fg-alt) + (mail-cite-2 fg-dim) + (mail-cite-3 fg-alt) + (mail-part yellow-cooler) + (mail-recipient green-cooler) + (mail-subject red-cooler) + (mail-other green))) + + +File: modus-themes.info, Node: Make the region preserve text colors plus other styles, Next: Make mouse highlights more or less colorful, Prev: Make mail citations and headers more or less colorful, Up: Stylistic variants using palette overrides + +5.2.18 Make the region preserve text colors, plus other styles +-------------------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to make the region respect the underlying text colors +or how to make the background more/less intense while combining it with +an appropriate foreground value. + + *note Do not extend the region background::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; A background with no specific foreground (use foreground of + ;; underlying text) + (setq modus-themes-common-palette-overrides + '((bg-region bg-ochre) ; try to replace `bg-ochre' with `bg-lavender', `bg-sage' + (fg-region unspecified))) + + ;; Subtle gray with a prominent blue foreground + (setq modus-themes-common-palette-overrides + '((bg-region bg-dim) + (fg-region blue-cooler))) + + ;; Intense magenta background combined with the main foreground + (setq modus-themes-common-palette-overrides + '((bg-region bg-magenta-intense) + (fg-region fg-main))) + + +File: modus-themes.info, Node: Make mouse highlights more or less colorful, Next: Make language underlines less colorful, Prev: Make the region preserve text colors plus other styles, Up: Stylistic variants using palette overrides + +5.2.19 Make mouse highlights more or less colorful +-------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In the following code block we show how to affect the semantic color +mapping that covers mouse hover effects and related highlights: + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Make the background an intense yellow + (setq modus-themes-common-palette-overrides + '((bg-hover bg-yellow-intense))) + + ;; Make the background subtle green + (setq modus-themes-common-palette-overrides + '((bg-hover bg-green-subtle))) + + +File: modus-themes.info, Node: Make language underlines less colorful, Next: Make line numbers use alternative styles, Prev: Make mouse highlights more or less colorful, Up: Stylistic variants using palette overrides + +5.2.20 Make language underlines less colorful +--------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to affect the color of the underlines that are used by +code linters and prose spell checkers. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Make the underlines less intense + (setq modus-themes-common-palette-overrides + '((underline-err red-faint) + (underline-warning yellow-faint) + (underline-note cyan-faint))) + + ;; Change the color-coding of the underlines + (setq modus-themes-common-palette-overrides + '((underline-err yellow-intense) + (underline-warning magenta-intense) + (underline-note green-intense))) + + +File: modus-themes.info, Node: Make line numbers use alternative styles, Next: Make diffs use only a foreground, Prev: Make language underlines less colorful, Up: Stylistic variants using palette overrides + +5.2.21 Make line numbers use alternative styles +----------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this section we show how to affect the ‘display-line-numbers-mode’. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Make line numbers less intense + (setq modus-themes-common-palette-overrides + '((fg-line-number-inactive "gray50") + (fg-line-number-active fg-main) + (bg-line-number-inactive unspecified) + (bg-line-number-active unspecified))) + + ;; Like the above, but use a shade of red for the current line number + (setq modus-themes-common-palette-overrides + '((fg-line-number-inactive "gray50") + (fg-line-number-active red-cooler) + (bg-line-number-inactive unspecified) + (bg-line-number-active unspecified))) + + ;; Make all numbers more intense, use a more pronounce gray + ;; background, and make the current line have a colored background + (setq modus-themes-common-palette-overrides + '((fg-line-number-inactive fg-main) + (fg-line-number-active fg-main) + (bg-line-number-inactive bg-inactive) + (bg-line-number-active bg-cyan-intense))) + + +File: modus-themes.info, Node: Make diffs use only a foreground, Next: Make deuteranopia diffs red and blue instead of yellow and blue, Prev: Make line numbers use alternative styles, Up: Stylistic variants using palette overrides + +5.2.22 Make diffs use only a foreground +--------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this section we show how to change diff buffers (e.g. in ‘magit’) to +only use color-coded text without any added background. What we +basically do is to disable the applicable backgrounds and then intensify +the foregrounds. Since the deuteranopia-optimized themes do not use the +red-green color coding, we make an extra set of adjustments for them by +overriding their palettes directly instead of just using the “common” +overrides. + + ;; Diffs with only foreground colors. Word-wise ("refined") diffs + ;; have a gray background to draw attention to themselves. + (setq modus-themes-common-palette-overrides + '((bg-added unspecified) + (bg-added-faint unspecified) + (bg-added-refine bg-inactive) + (fg-added green) + (fg-added-intense green-intense) + + (bg-changed unspecified) + (bg-changed-faint unspecified) + (bg-changed-refine bg-inactive) + (fg-changed yellow) + (fg-changed-intense yellow-intense) + + (bg-removed unspecified) + (bg-removed-faint unspecified) + (bg-removed-refine bg-inactive) + (fg-removed red) + (fg-removed-intense red-intense) + + (bg-diff-context unspecified))) + + ;; Because deuteranopia cannot use the typical red-yellow-green + ;; combination, we need to arrange for a yellow-purple-blue sequence. + ;; Notice that the above covers the "common" overrides, so we do not + ;; need to reproduce the whole list of them. + (setq modus-operandi-deuteranopia-palette-overrides + '((fg-added blue) + (fg-added-intense blue-intense) + + (fg-changed magenta-cooler) + (fg-changed-intense magenta-intense) + + (fg-removed yellow-warmer) + (fg-removed-intense yellow-intense))) + + (setq modus-vivendi-deuteranopia-palette-overrides + '((fg-added blue) + (fg-added-intense blue-intense) + + (fg-changed magenta-cooler) + (fg-changed-intense magenta-intense) + + (fg-removed yellow) + (fg-removed-intense yellow-intense))) + + +File: modus-themes.info, Node: Make deuteranopia diffs red and blue instead of yellow and blue, Next: Make the themes look like what the maintainer uses, Prev: Make diffs use only a foreground, Up: Stylistic variants using palette overrides + +5.2.23 Make deuteranopia diffs red and blue instead of yellow and blue +---------------------------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this section we show how to implement a red+blue color coding for +diffs in the themes ‘modus-operandi-deuteranopia’ and +‘modus-vivendi-deuteranopia’. As those themes are optimized for users +with red-green color deficiency, they do not use the typical red+green +color coding for diffs, defaulting instead to yellow+blue which are +discernible. Users with deuteranomaly or, generally, those who like a +different aesthetic, can use the following to make diffs use the +red+yellow+blue color coding for removed, changed, and added lines +respectively. This is achieved by overriding the “changed” and +“removed” entries to use the colors of regular ‘modus-operandi’ and +‘modus-vivendi’. + + (setq modus-operandi-deuteranopia-palette-overrides + '((bg-changed "#ffdfa9") + (bg-changed-faint "#ffefbf") + (bg-changed-refine "#fac090") + (bg-changed-fringe "#d7c20a") + (fg-changed "#553d00") + (fg-changed-intense "#655000") + + (bg-removed "#ffd8d5") + (bg-removed-faint "#ffe9e9") + (bg-removed-refine "#f3b5af") + (bg-removed-fringe "#d84a4f") + (fg-removed "#8f1313") + (fg-removed-intense "#aa2222"))) + + (setq modus-vivendi-deuteranopia-palette-overrides + '((bg-changed "#363300") + (bg-changed-faint "#2a1f00") + (bg-changed-refine "#4a4a00") + (bg-changed-fringe "#8a7a00") + (fg-changed "#efef80") + (fg-changed-intense "#c0b05f") + + (bg-removed "#4f1119") + (bg-removed-faint "#380a0f") + (bg-removed-refine "#781a1f") + (bg-removed-fringe "#b81a1f") + (fg-removed "#ffbfbf") + (fg-removed-intense "#ff9095"))) + + +File: modus-themes.info, Node: Make the themes look like what the maintainer uses, Prev: Make deuteranopia diffs red and blue instead of yellow and blue, Up: Stylistic variants using palette overrides + +5.2.24 Make the themes look like what the maintainer uses +--------------------------------------------------------- + +Based on what we have learnt from the previous sections of this manual, +here is what Protesilaos uses: + + ;; Always reload the theme for changes to take effect! + + (setq modus-themes-custom-auto-reload nil + modus-themes-to-toggle '(modus-operandi modus-vivendi) + modus-themes-mixed-fonts t + modus-themes-variable-pitch-ui nil + modus-themes-italic-constructs t + modus-themes-bold-constructs nil + modus-themes-org-blocks nil + modus-themes-completions '((t . (extrabold))) + modus-themes-prompts nil + modus-themes-headings + '((agenda-structure . (variable-pitch light 2.2)) + (agenda-date . (variable-pitch regular 1.3)) + (t . (regular 1.15)))) + + (setq modus-themes-common-palette-overrides + '((cursor magenta-cooler) + ;; Make the fringe invisible. + (fringe unspecified) + ;; Make line numbers less intense and add a shade of cyan + ;; for the current line number. + (fg-line-number-inactive "gray50") + (fg-line-number-active cyan-cooler) + (bg-line-number-inactive unspecified) + (bg-line-number-active unspecified) + ;; Make the current line of `hl-line-mode' a fine shade of + ;; gray (though also see my `lin' package). + (bg-hl-line bg-dim) + ;; Make the region have a cyan-green background with no + ;; specific foreground (use foreground of underlying text). + ;; "bg-sage" refers to Salvia officinalis, else the common + ;; sage. + (bg-region bg-sage) + (fg-region unspecified) + ;; Make matching parentheses a shade of magenta. It + ;; complements the region nicely. + (bg-paren-match bg-magenta-intense) + ;; Make email citations faint and neutral, reducing the + ;; default four colors to two; make mail headers cyan-blue. + (mail-cite-0 fg-dim) + (mail-cite-1 blue-faint) + (mail-cite-2 fg-dim) + (mail-cite-3 blue-faint) + (mail-part cyan-warmer) + (mail-recipient blue-warmer) + (mail-subject magenta-cooler) + (mail-other cyan-warmer) + ;; Change dates to a set of more subtle combinations. + (date-deadline magenta-cooler) + (date-scheduled magenta) + (date-weekday fg-main) + (date-event fg-dim) + (date-now blue-faint) + ;; Make tags (Org) less colorful and tables look the same as + ;; the default foreground. + (prose-done cyan-cooler) + (prose-tag fg-dim) + (prose-table fg-main) + ;; Make headings less colorful (though I never use deeply + ;; nested headings). + (fg-heading-2 blue-faint) + (fg-heading-3 magenta-faint) + (fg-heading-4 blue-faint) + (fg-heading-5 magenta-faint) + (fg-heading-6 blue-faint) + (fg-heading-7 magenta-faint) + (fg-heading-8 blue-faint) + ;; Make the active mode line a fine shade of lavender + ;; (purple) and tone down the gray of the inactive mode + ;; lines. + (bg-mode-line-active bg-lavender) + (border-mode-line-active bg-lavender) + + (bg-mode-line-inactive bg-dim) + (border-mode-line-inactive bg-inactive) + ;; Make the prompts a shade of magenta, to fit in nicely with + ;; the overall blue-cyan-purple style of the other overrides. + ;; Add a nuanced background as well. + (bg-prompt bg-magenta-nuanced) + (fg-prompt magenta-cooler) + ;; Tweak some more constructs for stylistic constistency. + (name blue-warmer) + (identifier magenta-faint) + (keybind magenta-cooler) + (accent-0 magenta-cooler) + (accent-1 cyan-cooler) + (accent-2 blue-warmer) + (accent-3 red-cooler))) + + ;; Make the active mode line have a pseudo 3D effect (this assumes + ;; you are using the default mode line and not an extra package). + (custom-set-faces + '(mode-line ((t :box (:style released-button))))) + + +File: modus-themes.info, Node: More accurate colors in terminal emulators, Next: Range of color with terminal emulators, Prev: Stylistic variants using palette overrides, Up: Advanced customization + +5.3 More accurate colors in terminal emulators +============================================== + +[ This is based on partial information. Please help verify and/or +expand these findings. ] + + The graphical version of Emacs can reproduce color values accurately. +Whereas things get more tricky when Emacs is used in a terminal +emulator, because the terminals’ own capabilities determine the number +of colors that may be displayed: the Modus themes don’t look as good in +that case. + + There is, however, a way to instruct supported terminal emulators to +use more accurate colors. In a shell prompt type ‘toe -a | grep direct’ +to get a list of relevant terminfo entries. There should be items such +as ‘xterm-direct’, ‘alacritty-direct’, ‘kitty-direct’. Once you find +the one that corresponds to your terminal, call Emacs with an +environment variable like ‘TERM=xterm-direct’. Example that can be +adapted to shell aliases: + + TERM=xterm-direct emacsclient -nw + + Another example that can be bound to a key: + + TERM=xterm-direct uxterm -e emacsclient -nw + + +File: modus-themes.info, Node: Range of color with terminal emulators, Next: Preview theme colors, Prev: More accurate colors in terminal emulators, Up: Advanced customization + +5.4 Range of color with terminal emulators +========================================== + +[ This is based on partial information. Please help verify and/or +expand these findings. ] + + When Emacs runs in a non-windowed session its color reproduction +capacity is framed or determined by the underlying terminal emulator +(*note More accurate colors in terminal emulators::). Emacs cannot +produce a color that lies outside the range of what the terminal’s color +palette renders possible. + + This is immediately noticeable when the terminal’s first 16 codes do +not include a pure black value for the ‘termcol0’ entry and a pure white +for ‘termcol15’. Emacs cannot set the correct background (white for +‘modus-operandi’; black for ‘modus-vivendi’) or foreground (inverse of +the background). It thus falls back to the closest approximation, which +seldom is appropriate for the purposes of the Modus themes. + + In such a case, the user is expected to update their terminal’s color +palette such as by adapting these resources (*note Preview theme +colors::): + + ! Theme: modus-operandi + ! Description: XTerm port of modus-operandi (Modus themes for GNU Emacs) + ! Author: Protesilaos Stavrou, <https://protesilaos.com> + xterm*background: #ffffff + xterm*foreground: #000000 + xterm*color0: #000000 + xterm*color1: #a60000 + xterm*color2: #005e00 + xterm*color3: #813e00 + xterm*color4: #0031a9 + xterm*color5: #721045 + xterm*color6: #00538b + xterm*color7: #bfbfbf + xterm*color8: #595959 + xterm*color9: #972500 + xterm*color10: #315b00 + xterm*color11: #70480f + xterm*color12: #2544bb + xterm*color13: #5317ac + xterm*color14: #005a5f + xterm*color15: #ffffff + + ! Theme: modus-vivendi + ! Description: XTerm port of modus-vivendi (Modus themes for GNU Emacs) + ! Author: Protesilaos Stavrou, <https://protesilaos.com> + xterm*background: #000000 + xterm*foreground: #ffffff + xterm*color0: #000000 + xterm*color1: #ff8059 + xterm*color2: #44bc44 + xterm*color3: #d0bc00 + xterm*color4: #2fafff + xterm*color5: #feacd0 + xterm*color6: #00d3d0 + xterm*color7: #bfbfbf + xterm*color8: #595959 + xterm*color9: #ef8b50 + xterm*color10: #70b900 + xterm*color11: #c0c530 + xterm*color12: #79a8ff + xterm*color13: #b6a0ff + xterm*color14: #6ae4b9 + xterm*color15: #ffffff + + +File: modus-themes.info, Node: Preview theme colors, Next: Per-theme customization settings, Prev: Range of color with terminal emulators, Up: Advanced customization + +5.5 Preview theme colors +======================== + +The command ‘modus-themes-list-colors’ uses minibuffer completion to +select an item from the Modus themes and then produces a buffer with +previews of its color palette entries. The buffer has a naming scheme +that reflects the given choice, like ‘modus-operandi-list-colors’ for +the ‘modus-operandi’ theme. + + The command ‘modus-themes-list-colors-current’ skips the minibuffer +selection process and just produces a preview for the current Modus +theme. + + When called with a prefix argument (‘C-u’ with the default key +bindings), these commands will show a preview of the palette’s semantic +color mappings instead of the named colors. In this context, “named +colors” are entries that associate a symbol to a string color value, +such as ‘(blue-warmer "#354fcf")’. Whereas “semantic color mappings” +associate a named color to a symbol, like ‘(string blue-warmer)’, thus +making the theme render all string constructs in the ‘blue-warmer’ color +value (*note Option for palette overrides: Palette overrides.). + + Aliases for those commands are ‘modus-themes-preview-colors’ and +‘modus-themes-preview-colors-current’. + + Each row shows a foreground and background coloration using the +underlying value it references. For example a line with ‘#a60000’ (a +shade of red) will show red text followed by a stripe with that same +color as a backdrop. + + The name of the buffer describes the given Modus theme and what the +contents are, such as ‘*modus-operandi-list-colors*’ for named colors +and ‘=*modus-operandi-list-mappings*’ for the semantic color mappings. + + +File: modus-themes.info, Node: Per-theme customization settings, Next: Get a single color from the palette, Prev: Preview theme colors, Up: Advanced customization + +5.6 Per-theme customization settings +==================================== + +If you prefer to maintain different customization options between the +two themes, it is best you write your own functions that first set those +options and then load the relevant theme. The following code does +exactly that by simply differentiating the two themes on the choice of +bold constructs in code syntax (enabled for one, disabled for the +other). + + (defun my-demo-modus-operandi () + (interactive) + (setq modus-themes-bold-constructs t) ; ENABLE bold + (modus-themes-load-theme 'modus-operandi)) + + (defun my-demo-modus-vivendi () + (interactive) + (setq modus-themes-bold-constructs nil) ; DISABLE bold + (modus-themes-load-theme 'modus-vivendi)) + + (defun my-demo-modus-themes-toggle () + (if (eq (car custom-enabled-themes) 'modus-operandi) + (my-demo-modus-vivendi) + (my-demo-modus-operandi))) + + Then assign ‘my-demo-modus-themes-toggle’ to a key instead of the +equivalent the themes provide. + + For a more elaborate design, it is better to inspect the source code +of ‘modus-themes-toggle’ and relevant functions. + + +File: modus-themes.info, Node: Get a single color from the palette, Next: Use theme colors in code with modus-themes-with-colors, Prev: Per-theme customization settings, Up: Advanced customization + +5.7 Get a single color from the palette +======================================= + +*note Use theme colors in code with modus-themes-with-colors::. + + The fuction ‘modus-themes-get-color-value’ can be called from Lisp to +return the value of a color from the active Modus theme palette. It +takea a ‘COLOR’ argument and an optional ‘OVERRIDES’. + + ‘COLOR’ is a symbol that represents a named color entry in the +palette. + + *note Preview theme colors::. + + If the value is the name of another color entry in the palette (so a +mapping), this function recurs until it finds the underlying color +value. + + With an optional ‘OVERRIDES’ argument as a non-‘nil’ value, it +accounts for palette overrides. Else it reads only the default palette. + + *note Option for palette overrides: Palette overrides. + + With optional ‘THEME’ as a symbol among ‘modus-themes-items’ (alias +‘modus-themes-collection’), use the palette of that item. Else use the +current Modus theme. + + If ‘COLOR’ is not present in the palette, this function returns the +‘unspecified’ symbol, which is safe when used as a face attribute’s +value. + + An example with ‘modus-operandi’ to show how this function behaves +with/without overrides and when recursive mappings are introduced. + + ;; Here we show the recursion of palette mappings. In general, it is + ;; better for the user to specify named colors to avoid possible + ;; confusion with their configuration, though those still work as + ;; expected. + (setq modus-themes-common-palette-overrides + '((cursor red) + (fg-mode-line-active cursor) + (border-mode-line-active fg-mode-line-active))) + + ;; Ignore the overrides and get the original value. + (modus-themes-get-color-value 'border-mode-line-active) + ;; => "#5a5a5a" + + ;; Read from the overrides and deal with any recursion to find the + ;; underlying value. + (modus-themes-get-color-value 'border-mode-line-active :overrides) + ;; => "#a60000" + + +File: modus-themes.info, Node: Use theme colors in code with modus-themes-with-colors, Next: Do not extend the region background, Prev: Get a single color from the palette, Up: Advanced customization + +5.8 Use theme colors in code with modus-themes-with-colors +========================================================== + +*note Get a single color from the palette::. + + Note that users most probably do not need the following. Just rely +on the comprehensive overrides we provide (*note Option for palette +overrides: Palette overrides.). + + Advanced users may want to apply colors from the palette of the +active Modus theme in their custom code. The ‘modus-themes-with-colors’ +macro supplies those to any form called inside of it. For example: + + (modus-themes-with-colors + (list blue-warmer magenta-cooler fg-added warning variable fg-heading-4)) + ;; => ("#354fcf" "#531ab6" "#005000" "#884900" "#005e8b" "#721045") + + The above return value is for ‘modus-operandi’ when that is the +active theme. Switching to another theme and evaluating this code anew +will give us the relevant results for that theme (remember that since +version 4, the Modus themes consist of six items (*note Overview::)). +The same with ‘modus-vivendi’ as the active theme: + + (modus-themes-with-colors + (list blue-warmer magenta-cooler fg-added warning variable fg-heading-4)) + ;; => ("#79a8ff" "#b6a0ff" "#a0e0a0" "#fec43f" "#00d3d0" "#feacd0") + + The ‘modus-themes-with-colors’ has access to the whole palette of the +active theme, meaning that it can instantiate both (i) named colors like +‘blue-warmer’ and (ii) semantic color mappings like ‘warning’. We +provide commands to inspect those (*note Preview theme colors::). + + Others sections in this manual show how to use the aforementioned +macro (*note Advanced customization::). + + Because the ‘modus-themes-with-colors’ will most likely be used to +customize faces, note that any function that calls it must be run at +startup after the theme loads. The same function must also be assigned +to the ‘modus-themes-after-load-theme-hook’ for its effects to persist +and be updated when switching between Modus themes (e.g. to update the +exact value of ‘blue-warmer’ when toggling between ‘modus-operandi’ to +‘modus-vivendi’. + + +File: modus-themes.info, Node: Do not extend the region background, Next: Add padding to mode line, Prev: Use theme colors in code with modus-themes-with-colors, Up: Advanced customization + +5.9 Do not extend the region background +======================================= + +By the default, the background of the ‘region’ face extends from the end +of the line to the edge of the window. To limit it to the end of the +line, we need to override the face’s ‘:extend’ attribute. Adding this +to the Emacs configuration file will suffice: + + ;; Do not extend `region' background past the end of the line. + (custom-set-faces + '(region ((t :extend nil)))) + + *note Make the region preserve text colors, plus other styles: Make +the region preserve text colors plus other styles. + + +File: modus-themes.info, Node: Add padding to mode line, Next: Remap face with local value, Prev: Do not extend the region background, Up: Advanced customization + +5.10 Add padding to mode line +============================= + +Emacs faces do not have a concept of “padding” for the space between the +text and its box boundaries. We can approximate the effect by adding a +‘:box’ attribute, making its border several pixels thick, and using the +mode line’s background color for it. This way the thick border will not +stand out and will appear as a continuation of the mode line. + + *note Use theme colors in code with modus-themes-with-colors::. + + (defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + ;; Add "padding" to the mode lines + `(mode-line ((,c :box (:line-width 10 :color ,bg-mode-line-active)))) + `(mode-line-inactive ((,c :box (:line-width 10 :color ,bg-mode-line-inactive))))))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) + + The above has the effect of removing the border around the mode +lines. In older versions of the themes, we provided the option for a +padded mode line which could also have borders around it. Those were +not real border, however, but an underline and an overline. Adjusting +the above: + + (defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + ;; Add "padding" to the mode lines + `(mode-line ((,c :underline ,border-mode-line-active + :overline ,border-mode-line-active + :box (:line-width 10 :color ,bg-mode-line-active)))) + `(mode-line-inactive ((,c :underline ,border-mode-line-inactive + :overline ,border-mode-line-inactive + :box (:line-width 10 :color ,bg-mode-line-inactive))))))) + + ;; ESSENTIAL to make the underline move to the bottom of the box: + (setq x-underline-at-descent-line t) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) + + The reason we no longer provide this option is because it depends on +a non-‘nil’ value for ‘x-underline-at-descent-line’. That variable +affects ALL underlines, including those of links. The effect is +intrusive and looks awkard in prose. + + As such, the Modus themes no longer provide that option but instead +offer this piece of documentation to make the user fully aware of the +state of affairs. + + +File: modus-themes.info, Node: Remap face with local value, Next: Font configurations for Org and others, Prev: Add padding to mode line, Up: Advanced customization + +5.11 Remap face with local value +================================ + +There are cases where we need to change the buffer-local attributes of a +face. This might be because we have our own minor mode that re-uses a +face for a particular purpose, such as a line selection tool that +activates ‘hl-line-mode’, but we wish to keep it distinct from other +buffers. This is where ‘face-remap-add-relative’ can be applied and may +be combined with ‘modus-themes-with-colors’ to deliver consistent +results. + + *note Use theme colors in code with modus-themes-with-colors::. + + In this example we will write a simple interactive function that +adjusts the background color of the ‘region’ face. This is the sample +code: + + (defvar my-rainbow-region-colors + (modus-themes-with-colors + `((red . ,bg-red-subtle) + (green . ,bg-green-subtle) + (yellow . ,bg-yellow-subtle) + (blue . ,bg-blue-subtle) + (magenta . ,bg-magenta-subtle) + (cyan . ,bg-cyan-subtle))) + "Sample list of color values for `my-rainbow-region'.") + + (defun my-rainbow-region (color) + "Remap buffer-local attribute of `region' using COLOR." + (interactive + (list + (completing-read "Pick a color: " my-rainbow-region-colors))) + (face-remap-add-relative + 'region + `( :background ,(alist-get (intern color) my-rainbow-region-colors) + :foreground ,(face-attribute 'default :foreground)))) + + When ‘my-rainbow-region’ is called interactively, it prompts for a +color to use. The list of candidates is drawn from the car of each +association in ‘my-rainbow-region-colors’ (so “red”, “green”, etc.). + + To extend this principle, we may write wrapper functions that pass a +color directly. Those can be useful in tandem with hooks. Consider +this example: + + (defun my-rainbow-region-magenta () + (my-rainbow-region 'magenta)) + + (add-hook 'diff-mode-hook #'my-rainbow-region-magenta) + + Whenever we enter a ‘diff-mode’ buffer, we now get a magenta-colored +region. + + Perhaps you may wish to generalize those findings in to a set of +functions that also accept an arbitrary face. We shall leave the +experimentation up to you. + + +File: modus-themes.info, Node: Font configurations for Org and others, Next: Configure bold and italic faces, Prev: Remap face with local value, Up: Advanced customization + +5.12 Font configurations for Org and others +=========================================== + +The themes are designed to optionally cope well with mixed font +configurations. This mostly concerns ‘org-mode’ and ‘markdown-mode’, +though expect to find it elsewhere like in ‘Info-mode’. + + *note Option for font mixing: Mixed fonts. + + In practice it means that the user can safely opt for a more +prose-friendly proportionately spaced typeface as their default, while +spacing-sensitive elements like tables and inline code always use a +monospaced font, by inheriting from the ‘fixed-pitch’ face. + + Users can try the built-in ‘M-x variable-pitch-mode’ to see the +effect in action. + + To make everything use your desired font families, you need to +configure the ‘variable-pitch’ (proportional spacing) and ‘fixed-pitch’ +(monospaced) faces respectively. It may also be convenient to set your +main typeface by configuring the ‘default’ face the same way. + + [ The ‘fontaine’ package on GNU ELPA (by Protesilaos) is designed to +handle this case. ] + + Put something like this in your initialization file (also consider +reading the doc string of ‘set-face-attribute’): + + ;; Main typeface + (set-face-attribute 'default nil :family "DejaVu Sans Mono" :height 110) + + ;; Proportionately spaced typeface + (set-face-attribute 'variable-pitch nil :family "DejaVu Serif" :height 1.0) + + ;; Monospaced typeface + (set-face-attribute 'fixed-pitch nil :family "DejaVu Sans Mono" :height 1.5) + + Or employ the ‘face-attribute’ function to read an existing value, +such as if you want to make ‘fixed-pitch’ use the font family of the +‘default’ face: + + (set-face-attribute 'fixed-pitch nil :family (face-attribute 'default :family)) + + The next section shows how to make those work in a more elaborate +setup that is robust to changes between the Modus themes. + + *note Configure bold and italic faces::. + + Note the differences in the ‘:height’ property. The ‘default’ face +must specify an absolute value, which is the point size × 10. So if you +want to use a font at point size ‘11’, you set the height to ‘110’.(1) +Whereas every other face must either not specify a height or have a +value that is relative to the default, represented as a floating point. +If you use an integer, then that means an absolute height. This is of +paramount importance: it ensures that all fonts can scale gracefully +when using something like the ‘text-scale-adjust’ command which only +operates on the base font size (i.e. the ‘default’ face’s absolute +height). + + *note Note for EWW and Elfeed fonts: Note on SHR fonts. + + ---------- Footnotes ---------- + + (1) ‘:height’ values do not need to be rounded to multiples of ten: +the likes of ‘115’ are perfectly valid—some typefaces will change to +account for those finer increments. + + +File: modus-themes.info, Node: Configure bold and italic faces, Next: Custom Org todo keyword and priority faces, Prev: Font configurations for Org and others, Up: Advanced customization + +5.13 Configure bold and italic faces +==================================== + +The Modus themes do not hardcode a ‘:weight’ or ‘:slant’ attribute in +the thousands of faces they cover. Instead, they configure the generic +faces called ‘bold’ and ‘italic’ to use the appropriate styles and then +instruct all relevant faces that require emphasis to inherit from them. + + This practically means that users can change the particularities of +what it means for a construct to be bold/italic, by tweaking the ‘bold’ +and ‘italic’ faces. Cases where that can be useful include: + + • The default typeface does not have a variant with slanted glyphs + (e.g. Fira Mono/Code as of this writing on 2021-07-07), so the + user wants to add another family for the italics, such as Hack. + + • The typeface of choice provides a multitude of weights and the user + prefers the light one by default. To prevent the bold weight from + being too heavy compared to the light one, they opt to make ‘bold’ + use a semibold weight. + + • The typeface distinguishes between oblique and italic forms by + providing different font variants (the former are just slanted + versions of the upright forms, while the latter have distinguishing + features as well). In this case, the user wants to specify the + font that applies to the ‘italic’ face. + + To achieve those effects, one must first be sure that the fonts they +use have support for those features. It then is a matter of following +the instructions for all typeface tweaks. + + *note Font configurations for Org and others::. + + In this example, we set the default font family to Fira Code, while +we choose to render italics in the Hack typeface (obviously you need to +pick fonts that work well together): + + (set-face-attribute 'default nil :family "Fira Code" :height 110) + (set-face-attribute 'italic nil :family "Hack") + + And here we play with different weights, using Source Code Pro: + + (set-face-attribute 'default nil :family "Source Code Pro" :height 110 :weight 'light) + (set-face-attribute 'bold nil :weight 'semibold) + + To reset the font family, one can use this: + + (set-face-attribute 'italic nil :family 'unspecified) + + To ensure that the effects persist after switching between the Modus +themes (such as with ‘M-x modus-themes-toggle’), the user needs to write +their configurations to a function and pass it to the +‘modus-themes-after-load-theme-hook’. This is necessary because themes +set the styles of faces upon activation, overriding prior values where +conflicts occur between the previous and the current states (otherwise +changing themes would not be possible). + + *note A theme-agnostic hook for theme loading::. + + This is a minimal setup to preserve font configurations across theme +load phases. For a more permanent setup, it is better to rely on the +‘custom-set-faces’ function: ‘set-face-attribute’ works just fine, +though it probably is better suited for quick previews or for smaller +scale operations (‘custom-set-faces’ follows the format used in the +source code of the themes, which can make it easier to redefine faces in +bulk). + + ;; our generic function + (defun my-modes-themes-bold-italic-faces () + (set-face-attribute 'default nil :family "Source Code Pro" :height 110) + (set-face-attribute 'bold nil :weight 'semibold)) + + ;; or use this if you configure a lot of face and attributes and + ;; especially if you plan to use `modus-themes-with-colors', as shown + ;; elsewhere in the manual + (defun my-modes-themes-bold-italic-faces () + (custom-set-faces + '(default ((t :family "Source Code Pro" :height 110))) + '(bold ((t :weight semibold))))) + + ;; and here is the hook + (add-hook 'modus-themes-after-load-theme-hook #'my-modes-themes-bold-italic-faces) + + *note Use theme colors in code with modus-themes-with-colors::. + + +File: modus-themes.info, Node: Custom Org todo keyword and priority faces, Next: Custom Org emphasis faces, Prev: Configure bold and italic faces, Up: Advanced customization + +5.14 Custom Org todo keyword and priority faces +=============================================== + +Users of ‘org-mode’ have the option to configure various keywords and +priority cookies to better match their workflow. User options are +‘org-todo-keyword-faces’ and ‘org-priority-faces’. + + As those are meant to be custom faces, it is futile to have the +themes guess what each user wants to use, which keywords to target, and +so on. Instead, we can provide guidelines on how to customize things to +one’s liking with the intent of retaining the overall aesthetic of the +themes. + + Please bear in mind that the end result of those is not controlled by +the active Modus theme but by how Org maps faces to its constructs. +Editing those while ‘org-mode’ is active requires re-initialization of +the mode with ‘M-x org-mode-restart’ for changes to take effect. + + Let us assume you wish to visually differentiate your keywords. You +have something like this: + + (setq org-todo-keywords + '((sequence "TODO(t)" "|" "DONE(D)" "CANCEL(C)") + (sequence "MEET(m)" "|" "MET(M)") + (sequence "STUDY(s)" "|" "STUDIED(S)") + (sequence "WRITE(w)" "|" "WROTE(W)"))) + + You could then use a variant of the following to inherit from a face +that uses the styles you want and also to preserve the attributes +applied by the ‘org-todo’ face (in case there is a difference between +the two): + + (setq org-todo-keyword-faces + '(("MEET" . (:inherit (bold org-todo))) + ("STUDY" . (:inherit (warning org-todo))) + ("WRITE" . (:inherit (shadow org-todo))))) + + This will refashion the keywords you specify, while letting the other +items in ‘org-todo-keywords’ use their original styles, which are +defined in the ‘org-todo’ and ‘org-done’ faces. + + If you want back the defaults, try specifying just the ‘org-todo’ +face: + + (setq org-todo-keyword-faces + '(("MEET" . org-todo) + ("STUDY" . org-todo) + ("WRITE" . org-todo))) + + Or set ‘org-todo-keyword-faces’ to ‘nil’. + + When you inherit from multiple faces, you need to do it the way it is +shown further above. The order is significant: the first entry is +applied on top of the second, overriding any attributes that are +explicitly set for both of them: any attribute that is not specified is +not overridden, so, for example, if ‘org-todo’ has a background and a +foreground, while ‘font-lock-type-face’ only has a foreground, the +merged face will include the background of the former and the foreground +of the latter. If you do not want to blend multiple faces, you only +specify one by name without parentheses or an ‘:inherit’ keyword. A +pattern of ‘keyword . face’ will suffice. + + Both approaches can be used simultaneously, as illustrated in this +configuration of the priority cookies: + + (setq org-priority-faces + '((?A . (:inherit (bold org-priority))) + (?B . org-priority) + (?C . (:inherit (shadow org-priority))))) + + To find all the faces that are loaded in your current Emacs session, +use ‘M-x list-faces-display’. Try ‘M-x describe-variable’ as well and +then specify the name of each of those Org variables demonstrated above. +Their documentation strings will offer you further guidance. + + Recall that the themes let you retrieve a color from their palette. +Do it if you plan to control face attributes. + + *note Check color combinations: Measure color contrast. + + +File: modus-themes.info, Node: Custom Org emphasis faces, Next: Update Org block delimiter fontification, Prev: Custom Org todo keyword and priority faces, Up: Advanced customization + +5.15 Custom Org emphasis faces +============================== + +Org provides the user option ‘org-emphasis-alist’ which associates a +character with a face, list of faces, or face attributes. The default +specification of that variable looks like this: + + (setq org-emphasis-alist + '(("*" bold) + ("/" italic) + ("_" underline) + ("=" org-verbatim verbatim) + ("~" org-code verbatim) + ("+" (:strike-through t)))) + + With the exception of ‘org-verbatim’ and ‘org-code’ faces, everything +else uses the corresponding type of emphasis: a bold typographic weight, +or italicised, underlined, and struck through text. + + The best way for users to add some extra attributes, such as a +foreground color, is to define their own faces and assign them to the +given emphasis marker/character. + + This is a custom face that extends the standard ‘bold’ face with a +red foreground value (so it colorises the text in addition to the bold +weight): + + (defface my-org-emphasis-bold + '((default :inherit bold) + (((class color) (min-colors 88) (background light)) + :foreground "#a60000") + (((class color) (min-colors 88) (background dark)) + :foreground "#ff8059")) + "My bold emphasis for Org.") + + This face definition reads as follows: + + • Always inherit the ‘bold’ face (*note Configure bold and italic + faces::). + • For versions of Emacs that support at least 88 colors (graphical + Emacs, for example) and use a light background, apply the ‘#a60000’ + value. + • For the same kind of Emacs that has a dark background use the + ‘#ff8059’ color instead. + + Same principle for how to extend ‘italic’ and ‘underline’ with, for +example, green and yellow hues, respectively: + + (defface my-org-emphasis-italic + '((default :inherit italic) + (((class color) (min-colors 88) (background light)) + :foreground "#005e00") + (((class color) (min-colors 88) (background dark)) + :foreground "#44bc44")) + "My italic emphasis for Org.") + + (defface my-org-emphasis-underline + '((default :inherit underline) + (((class color) (min-colors 88) (background light)) + :foreground "#813e00") + (((class color) (min-colors 88) (background dark)) + :foreground "#d0bc00")) + "My underline emphasis for Org.") + + In the case of a strike-through effect, we have no generic face to +inherit from, so we can write it as follows to also change the +foreground to a more subtle gray: + + (defface my-org-emphasis-strike-through + '((default :strike-through t) + (((class color) (min-colors 88) (background light)) + :foreground "#505050") + (((class color) (min-colors 88) (background dark)) + :foreground "#a8a8a8")) + "My strike-through emphasis for Org.") + + Or we can just change the color of the line that strikes through the +text to, for example, a shade of red: + + (defface my-org-emphasis-strike-through + '((((class color) (min-colors 88) (background light)) + :strike-through "#972500") + (((class color) (min-colors 88) (background dark)) + :strike-through "#ef8b50")) + "My strike-through emphasis for Org.") + + It is possible to combine those effects: + + (defface my-org-emphasis-strike-through + '((((class color) (min-colors 88) (background light)) + :strike-through "#972500" :foreground "#505050") + (((class color) (min-colors 88) (background dark)) + :strike-through "#ef8b50" :foreground "#a8a8a8")) + "My strike-through emphasis for Org.") + + One may inspect the variables ‘modus-themes-operandi-colors’ and +‘modus-themes-vivendi-colors’ for possible color values. Or call the +command ‘modus-themes-list-colors’ to show a buffer that previews each +entry in the palette. + + *note Visualize the active Modus theme’s palette: Preview theme +colors. + + Once we have defined the faces we need, we must update the +‘org-emphasis-alist’. Given that ‘org-verbatim’ and ‘org-code’ are +already styled by the themes, it probably is best not to edit them: + + (setq org-emphasis-alist + '(("*" my-org-emphasis-bold) + ("/" my-org-emphasis-italic) + ("_" my-org-emphasis-underline) + ("=" org-verbatim verbatim) + ("~" org-code verbatim) + ("+" my-org-emphasis-strike-through))) + + That’s it! For changes to take effect in already visited Org files, +invoke ‘M-x org-mode-restart’. + + +File: modus-themes.info, Node: Update Org block delimiter fontification, Next: Measure color contrast, Prev: Custom Org emphasis faces, Up: Advanced customization + +5.16 Update Org block delimiter fontification +============================================= + +As noted in the section about ‘modus-themes-org-blocks’, Org contains a +variable that determines whether the block’s begin and end lines are +extended to the edge of the window (*note Option for org-mode block +styles: Org mode blocks.). The variable is +‘org-fontify-whole-block-delimiter-line’. + + Users who change the style of Org blocks from time to time may prefer +to automatically update delimiter line fontification, such as with the +following setup: + + (defun my-modus-themes-org-fontify-block-delimiter-lines () + "Match `org-fontify-whole-block-delimiter-line' to theme style. + Run this function at the post theme load phase, such as with the + `modus-themes-after-load-theme-hook'." + (if (eq modus-themes-org-blocks 'gray-background) + (setq org-fontify-whole-block-delimiter-line t) + (setq org-fontify-whole-block-delimiter-line nil))) + + (add-hook 'modus-themes-after-load-theme-hook + #'my-modus-themes-org-fontify-block-delimiter-lines) + + Then ‘M-x org-mode-restart’ for changes to take effect, though manual +intervention can be circumvented by tweaking the function thus: + + (defun my-modus-themes-org-fontify-block-delimiter-lines () + "Match `org-fontify-whole-block-delimiter-line' to theme style. + Run this function at the post theme load phase, such as with the + `modus-themes-after-load-theme-hook'." + (if (eq modus-themes-org-blocks 'gray-background) + (setq org-fontify-whole-block-delimiter-line t) + (setq org-fontify-whole-block-delimiter-line nil)) + (when (derived-mode-p 'org-mode) + (font-lock-flush))) + + +File: modus-themes.info, Node: Measure color contrast, Next: Load theme depending on time of day, Prev: Update Org block delimiter fontification, Up: Advanced customization + +5.17 Measure color contrast +=========================== + +The themes provide the functions ‘modus-themes-wcag-formula’ and +‘modus-themes-contrast’. The former is a direct implementation of the +WCAG formula: <https://www.w3.org/TR/WCAG20-TECHS/G18.html>. It +calculates the relative luminance of a color value that is expressed in +hexadecimal RGB notation. While the latter function is just a +convenient wrapper for comparing the relative luminance between two +colors. + + In practice, one needs to work only with ‘modus-themes-contrast’. It +accepts two color values and returns their contrast ratio. Values range +from 1 to 21 (lowest to highest). The themes are designed to always be +equal or higher than 7 for each combination of background and foreground +that they use (this is the WCAG AAA standard—the most demanding of its +kind). + + A couple of examples (rounded numbers): + + ;; Pure white with pure green + (modus-themes-contrast "#ffffff" "#00ff00") + ;; => 1.37 + ;; That is an outright inaccessible combo + + ;; Pure black with pure green + (modus-themes-contrast "#000000" "#00ff00") + ;; => 15.3 + ;; That is a highly accessible combo + + It does not matter which color value comes first. The ratio is +always the same. + + If one does not wish to read all the decimal points, it is possible +to try something like this: + + (format "%0.2f" (modus-themes-contrast "#000000" "#00ff00")) + + While it is fine to perform such calculations on a case-by-case +basis, it is preferable to implement formulas and tables for more +demanding tasks. Such instruments are provided by ‘org-mode’ or +‘orgtbl-mode’, both of which are built into Emacs. Below is such a +table that derives the contrast ratio of all colors in the first column +(pure red, green, blue) relative to the color specified in the first row +of the second column (pure white) and rounds the results: + + | | #ffffff | + |---------+---------| + | #ff0000 | 4.00 | + | #00ff00 | 1.37 | + | #0000ff | 8.59 | + #+tblfm: $2='(modus-themes-contrast $1 @1$2);%0.2f + + To measure color contrast one needs to start from a known value. +This typically is the background. The Modus themes define an expanded +palette in large part because certain colors are only meant to be used +in combination with some others. Consult the source code for the +minutia and relevant commentary. + + Such knowledge may prove valuable while attempting to customize the +theme’s color palette. + + +File: modus-themes.info, Node: Load theme depending on time of day, Next: Backdrop for pdf-tools, Prev: Measure color contrast, Up: Advanced customization + +5.18 Load theme depending on time of day +======================================== + +While we do provide ‘modus-themes-toggle’ to manually switch between the +themes, users may also set up their system to perform such a task +automatically at sunrise and sunset. + + This can be accomplished by specifying the coordinates of one’s +location using the built-in ‘solar.el’ and then configuring the +‘circadian’ package: + + (use-package solar ; built-in + :config + (setq calendar-latitude 35.17 + calendar-longitude 33.36)) + + (use-package circadian ; you need to install this + :ensure t + :after solar + :config + (setq circadian-themes '((:sunrise . modus-operandi) + (:sunset . modus-vivendi))) + (circadian-setup)) + + +File: modus-themes.info, Node: Backdrop for pdf-tools, Next: Toggle themes without reloading them, Prev: Load theme depending on time of day, Up: Advanced customization + +5.19 Backdrop for pdf-tools +=========================== + +Most PDF files use a white background for their page, making it +impossible to discern the file’s boundaries in the buffer while using +the Modus Operandi theme. To introduce a distinction between the +buffer’s backdrop and the PDF page’s background, the former must be +rendered as some shade of gray. Ideally, ‘pdf-tools’ would provide a +face that the themes could support directly, though this does not seem +to be the case for the time being. We must thus employ the face +remapping technique that is documented elsewhere in this document to +change the buffer-local value of the ‘default’ face. + + *note Remap face with local value::. + + To remap the buffer’s backdrop, we start with a function like this +one: + + (defun my-pdf-tools-backdrop () + (modus-themes-with-colors + (face-remap-add-relative + 'default + `(:background ,bg-dim)))) + + (add-hook 'pdf-tools-enabled-hook #'my-pdf-tools-backdrop) + + The idea is to assign that function to a hook that gets called when +‘pdf-tools’ renders the document: ‘pdf-tools-enabled-hook’. This is +enough when you only use one theme. However it has the downside of +setting the background color value only at render time. In other words, +the face remapping function does not get evaluated anew whenever the +theme changes, such as upon invoking ‘M-x modus-themes-toggle’. + + To have our face remapping adapt gracefully while switching between +the Modus themes, we need to also account for the current theme and +control the activation of ‘pdf-view-midnight-minor-mode’. To which end +we arrive at something like the following, which builds on the above +example: + + (defun my-pdf-tools-backdrop () + (modus-themes-with-colors + (face-remap-add-relative + 'default + `(:background ,bg-dim)))) + + (defun my-pdf-tools-midnight-mode-toggle () + (when (derived-mode-p 'pdf-view-mode) + (if (eq (car custom-enabled-themes) 'modus-vivendi) + (pdf-view-midnight-minor-mode 1) + (pdf-view-midnight-minor-mode -1)) + (my-pdf-tools-backdrop))) + + (defun my-pdf-tools-themes-toggle () + (mapc + (lambda (buf) + (with-current-buffer buf + (my-pdf-tools-midnight-mode-toggle))) + (buffer-list))) + + (add-hook 'pdf-tools-enabled-hook #'my-pdf-tools-midnight-mode-toggle) + (add-hook 'modus-themes-after-load-theme-hook #'my-pdf-tools-themes-toggle) + + With those in place, PDFs have a distinct backdrop for their page, +while buffers with major-mode as ‘pdf-view-mode’ automatically switches +to dark mode when ‘modus-themes-toggle’ is called. + + +File: modus-themes.info, Node: Toggle themes without reloading them, Next: A theme-agnostic hook for theme loading, Prev: Backdrop for pdf-tools, Up: Advanced customization + +5.20 Toggle themes without reloading them +========================================= + +Users who have a stable setup and who only ever need to toggle between +the themes without triggering a full reload, are better off defining +their own command which calls ‘enable-theme’ instead of ‘load-theme’: + + (defun my-modus-themes-toggle () + "Toggle between `modus-operandi' and `modus-vivendi' themes. + This uses `enable-theme' instead of the standard method of + `load-theme'. The technicalities are covered in the Modus themes + manual." + (interactive) + (pcase (modus-themes--current-theme) + ('modus-operandi (progn (enable-theme 'modus-vivendi) + (disable-theme 'modus-operandi))) + ('modus-vivendi (progn (enable-theme 'modus-operandi) + (disable-theme 'modus-vivendi))) + (_ (error "No Modus theme is loaded; evaluate `modus-themes-load-themes' first")))) + + *note Differences between loading and enabling::. + + Recall that ‘modus-themes-toggle’ uses ‘load-theme’. + + +File: modus-themes.info, Node: A theme-agnostic hook for theme loading, Next: Use more spacious margins or padding in Emacs frames, Prev: Toggle themes without reloading them, Up: Advanced customization + +5.21 A theme-agnostic hook for theme loading +============================================ + +The themes are designed with the intent to be useful to Emacs users of +varying skill levels, from beginners to experts. This means that we try +to make things easier by not expecting anyone reading this document to +be proficient in Emacs Lisp or programming in general. + + Such a case is with the use of ‘modus-themes-after-load-theme-hook’, +which runs after the ‘modus-themes-load-theme’ function (used by the +command ‘modus-themes-toggle’). We recommend using that hook for +advanced customizations, because (1) we know for sure that it is +available once the themes are loaded, and (2) anyone consulting this +manual, especially the sections on enabling and loading the themes, will +be in a good position to benefit from that hook. + + Advanced users who have a need to switch between the Modus themes and +other items will find that such a hook does not meet their requirements: +it only works with the Modus themes and only with the aforementioned +functions. + + A theme-agnostic setup can be configured thus: + + (defvar after-enable-theme-hook nil + "Normal hook run after enabling a theme.") + + (defun run-after-enable-theme-hook (&rest _args) + "Run `after-enable-theme-hook'." + (run-hooks 'after-enable-theme-hook)) + + (advice-add 'enable-theme :after #'run-after-enable-theme-hook) + + This creates the ‘after-enable-theme-hook’ and makes it run after +each call to ‘enable-theme’, which means that it will work for all +themes and also has the benefit that it does not depend on functions +such as ‘modus-themes-toggle’ and the others mentioned above. +‘enable-theme’ is called internally by ‘load-theme’, so the hook works +everywhere. + + The downside of the theme-agnostic hook is that any functions added +to it will likely not be able to benefit from macro calls that read the +active theme, such as ‘modus-themes-with-colors’. Not all Emacs themes +have the same capabilities. + + In this document, we cover ‘modus-themes-after-load-theme-hook’ +though the user can replace it with ‘after-enable-theme-hook’ should +they need to (provided they understand the implications). + + +File: modus-themes.info, Node: Use more spacious margins or padding in Emacs frames, Next: Custom hl-todo colors, Prev: A theme-agnostic hook for theme loading, Up: Advanced customization + +5.22 Use more spacious margins or padding in Emacs frames +========================================================= + +[ UPDATE 2023-06-25: Instead of following these instructions, you can +simply install my ‘spacious-padding’ package from GNU ELPA. It +implements the padding and provides relevant user options. ] + + By default, Emacs frames try to maximize the number of characters +that fit in the current visible portion of the buffer. Users may prefer +to have some extra padding instead. This can make Emacs frames look +more pleasant, but also make it easier to identify the currently active +window. + + The way to implement such padding is two-fold: + + 1. In the ‘early-init.el’ file instruct Emacs to use a higher value + for the ‘internal-border-width’ of all frames, as well as for the + ‘right-divider-width’. The former concerns the outer boundaries of + Emacs frames, while the latter pertains to dividers between Emacs + windows. + + 2. Make the relevant faces invisible by changing the value of their + relevant attributes to that of the current theme’s main background. + + The parameters of Emacs frames are specified in the variables +‘initial-frame-alist’ and ‘default-frame-alist’. The “initial frame” +refers to the first frame that appears on Emacs startup. The “default” +refers to the fallback values that apply to all other frames that Emacs +creates (unless those are explicitly overridden by a bespoke +‘make-frame’ call). + + In detail, first we use the same values for the two frame alist +variables: + + ;; This must go in the early-init.el so that it applies to the initial + ;; frame. + (dolist (var '(default-frame-alist initial-frame-alist)) + (add-to-list var '(right-divider-width . 20)) + (add-to-list var '(internal-border-width . 20))) + + What the ‘dolist’ does is to call ‘add-to-list’ for the two variables +we specify there. This economizes on typing. + + Then we define a function that makes the relevant faces invisible. +The reason we do this with a function is so we can hook it to the “post +load” phase of a theme, thus applying the new background value +(otherwise you keep the old background, which likely means that the +faces will no longer be invisible). + + (defun my-modus-themes-invisible-dividers () + "Make window dividers invisible. + Add this to the `modus-themes-post-load-hook'." + (let ((bg (face-background 'default))) + (custom-set-faces + `(fringe ((t :background ,bg :foreground ,bg))) + `(window-divider ((t :background ,bg :foreground ,bg))) + `(window-divider-first-pixel ((t :background ,bg :foreground ,bg))) + `(window-divider-last-pixel ((t :background ,bg :foreground ,bg)))))) + + (add-hook 'modus-themes-post-load-hook #'my-modus-themes-invisible-dividers) + + The above will work only for themes that belong to the Modus family. +For users of Emacs version 29 or higher, there exists a theme-agnostic +hook that takes a function with one argument—that of the theme—and calls +in the the “post enable” phase of theme loading. Here is the above +snippet, with the necessary tweaks: + + (defun my-modus-themes-invisible-dividers (_theme) + "Make window dividers for THEME invisible." + (let ((bg (face-background 'default))) + (custom-set-faces + `(fringe ((t :background ,bg :foreground ,bg))) + `(window-divider ((t :background ,bg :foreground ,bg))) + `(window-divider-first-pixel ((t :background ,bg :foreground ,bg))) + `(window-divider-last-pixel ((t :background ,bg :foreground ,bg)))))) + + (add-hook 'enable-theme-functions #'my-modus-themes-invisible-dividers) + + Users of older versions of Emacs can read the entry herein about +defining their own theme-agnostic hook (*note A theme-agnostic hook for +theme loading::). + + +File: modus-themes.info, Node: Custom hl-todo colors, Next: Add support for solaire-mode, Prev: Use more spacious margins or padding in Emacs frames, Up: Advanced customization + +5.23 Custom hl-todo colors +========================== + +The ‘hl-todo’ package provides the user option ‘hl-todo-keyword-faces’: +it specifies a pair of keyword and corresponding color value. The Modus +themes configure that option in the interest of legibility. While this +works for our purposes, users may still prefer to apply their custom +values, in which case the following approach is necessary: + + (defun my-modus-themes-hl-todo-faces () + (setq hl-todo-keyword-faces '(("TODO" . "#ff0000") + ("HACK" . "#ffff00") + ("XXX" . "#00ffff") + ("NOTE" . "#ff00ff")))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces) + + Or include a ‘let’ form, if needed: + + (defun my-modus-themes-hl-todo-faces () + (let ((red "#ff0000") + (blue "#0000ff")) + (setq hl-todo-keyword-faces `(("TODO" . ,blue) + ("HACK" . ,red) + ("XXX" . ,red) + ("NOTE" . ,blue))))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces) + + Normally, we do not touch user options, though this is an exception: +otherwise the defaults are not always legible. + + +File: modus-themes.info, Node: Add support for solaire-mode, Prev: Custom hl-todo colors, Up: Advanced customization + +5.24 Add support for solaire-mode +================================= + +The ‘solaire-mode’ package dims the background of what it considers +ancillary “UI” buffers, such as the minibuffer and Dired buffers. The +Modus themes used to support Solaire on the premise that the user was +(i) opting in to it, (ii) understood why certain buffers were more gray, +and (iii) knew what other adjustments had to be made to prevent broken +visuals (e.g. the default style of the ‘modus-themes-completions’ uses +a subtle gray background for the selection, which with Solaire becomes +practically invisible). + + However, the assumption that users opt in to this feature does not +always hold true. There are cases where it is enabled by defaultsuch as +in the popular Doom Emacs configuration. Thus, the unsuspecting user +who loads ‘modus-operandi’ or ‘modus-vivendi’ without the requisite +customizations is getting a sub-par experience; an experience that we +did not intend and cannot genuinely fix. + + Because the Modus themes are meant to work everywhere, we cannot make +an exception for Doom Emacs and/or Solaire users. Furthermore, we shall +not introduce hacks, such as by adding a check in all relevant faces to +be adjusted based on Solaire or whatever other package. Hacks of this +sort are unsustainable and penalize the entire userbase. Besides, the +themes are built into Emacs and we must keep their standard high. + + The fundamental constraint with Solaire is that Emacs does not have a +real distinction between “content” and “UI” buffers. For themes to work +with Solaire, they need to be designed around that package. Such is an +arrangement that compromises on our accessibility standards and/or +hinders our efforts to provide the best possible experience while using +the Modus themes. + + As such, ‘solaire-mode’ is not—and will not be—supported by the Modus +themes (or any other of my themes, for that matter). Users who want it +must style the faces manually. Below is some sample code, based on what +we cover at length elsewhere in this manual: + + *note Advanced customization::. + + *note Use theme colors in code with modus-themes-with-colors::. + + (defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + `(solaire-default-face ((,c :inherit default :background ,bg-dim :foreground ,fg-dim))) + `(solaire-line-number-face ((,c :inherit solaire-default-face :foreground ,fg-unfocused))) + `(solaire-hl-line-face ((,c :background ,bg-active))) + `(solaire-org-hide-face ((,c :background ,bg-dim :foreground ,bg-dim)))))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) + + As always, re-load the theme for changes to take effect. + + +File: modus-themes.info, Node: Face coverage, Next: Notes on individual packages, Prev: Advanced customization, Up: Top + +6 Face coverage +*************** + +The Modus themes try to provide as close to full face coverage as +possible. This is necessary to ensure a consistently accessible reading +experience across all available interfaces. + +* Menu: + +* Supported packages:: Full list of covered face groups +* Indirectly covered packages:: + + +File: modus-themes.info, Node: Supported packages, Next: Indirectly covered packages, Up: Face coverage + +6.1 Full support for packages or face groups +============================================ + +This list will always be updated to reflect the current state of the +project. The idea is to offer an overview of the known status of all +affected face groups. The items with an appended asterisk ‘*’ tend to +have lots of extensions, so the “full support” may not be 100% true… + + • ace-window + • agda2-mode + • all-the-icons + • all-the-icons-dired + • all-the-icons-ibuffer + • annotate + • ansi-color + • anzu + • auctex and TeX + • auto-dim-other-buffers + • avy + • bbdb + • binder + • breadcrumb [Part of 4.4.0-dev] + • bongo + • boon + • bookmark + • calendar and diary + • centaur-tabs + • change-log and log-view (such as ‘vc-print-log’, + ‘vc-print-root-log’) + • chart + • cider + • circe + • citar + • clojure-mode + • column-enforce-mode + • company-mode* + • compilation-mode + • completions + • consult + • corfu + • corfu-candidate-overlay [Part of 4.4.0-dev] + • corfu-quick + • counsel* + • cperl-mode + • crontab-mode + • csv-mode + • ctrlf + • custom (what you get with ‘M-x customize’) + • dashboard + • deadgrep + • deft + • devdocs + • dictionary + • diff-hl + • diff-mode + • dim-autoload + • dired + • dired-async + • dired-git + • dired-git-info + • dired-narrow + • dired-subtree + • diredfl + • disk-usage + • display-fill-column-indicator-mode + • doom-modeline + • ediff + • ein (Emacs IPython Notebook) + • eglot + • el-search + • eldoc-box + • elfeed + • elfeed-score + • elpher + • embark + • ement + • emms + • enh-ruby-mode (enhanced-ruby-mode) + • epa + • erc + • ert + • erts-mode [Part of 4.4.0-dev.] + • eshell + • eshell-fringe-status + • evil* (evil-mode) + • eww + • exwm + • eyebrowse + • flycheck + • flycheck-color-mode-line + • flycheck-indicator + • flymake + • flyspell + • flx + • focus + • fold-this + • font-lock (generic syntax highlighting) + • geiser + • git-commit + • git-gutter (and variants) + • git-rebase + • git-timemachine + • gnus + • gotest + • golden-ratio-scroll-screen + • helpful + • highlight-numbers + • highlight-parentheses (*note Note on highlight-parentheses.el: Note + on highlight-parenthesesel.) + • highlight-thing + • hl-fill-column + • hl-line-mode + • hl-todo + • hydra + • ibuffer + • icomplete + • ido-mode + • iedit + • iflipb + • image-dired + • imenu-list + • indium + • info + • info+ (info-plus) + • info-colors + • ioccur + • isearch, occur, etc. + • ivy* + • ivy-posframe + • japanese-holidays + • jira (org-jira) + • jit-spell + • jinx + • journalctl-mode + • js2-mode + • julia + • kaocha-runner + • keycast + • ledger-mode + • leerzeichen + • line numbers (‘display-line-numbers-mode’ and global variant) + • magit + • make-mode + • man + • marginalia + • markdown-mode + • markup-faces (‘adoc-mode’) + • messages + • minimap + • mode-line + • mood-line + • mpdel + • mu4e + • multiple-cursors + • nerd-icons [Part of 4.4.0-dev.] + • nerd-icons-completion [Part of 4.4.0-dev.] + • nerd-icons-dired [Part of 4.4.0-dev.] + • nerd-icons-ibuffer [Part of 4.4.0-dev.] + • neotree + • notmuch + • num3-mode + • nxml-mode + • olivetti + • orderless + • org* + • org-journal + • org-noter + • org-pomodoro + • org-recur + • org-roam + • org-superstar + • org-table-sticky-header + • org-tree-slide + • origami + • outline-mode + • outline-minor-faces + • package (what you get with ‘M-x list-packages’) + • page-break-lines + • pandoc-mode + • paren-face + • pass + • pdf-tools + • persp-mode + • perspective + • popup + • powerline + • prism (*note Note for prism.el: Note for prism.) + • prescient + • proced + • prodigy + • pulse + • pyim + • quick-peek + • rainbow-delimiters + • rcirc + • rcirc-color + • recursion-indicator + • regexp-builder (also known as ‘re-builder’) + • rg (rg.el) + • ripgrep + • rmail + • rst-mode + • ruler-mode + • sesman + • shell-script-mode + • shortdoc + • show-paren-mode + • shr + • side-notes + • sieve-mode + • skewer-mode + • slime (slbd) + • sly + • smart-mode-line + • smerge + • speedbar + • spell-fu + • stripes + • suggest + • switch-window + • swiper + • symbol-overlay + • syslog-mode + • tab-bar-mode + • tab-line-mode + • table (built-in ‘table.el’) + • telega + • terraform-mode + • term + • textsec + • transient (pop-up windows such as Magit’s) + • trashed + • tree-sitter + • tty-menu + • tuareg + • typescript + • undo-tree + • vc (‘vc-dir.el’, ‘vc-hooks.el’) + • vertico + • vertico-quick + • vimish-fold + • visible-mark + • visual-regexp + • vterm + • vundo + • wcheck-mode + • web-mode + • wgrep + • which-function-mode + • which-key + • whitespace-mode + • window-divider-mode + • writegood-mode + • woman + • xah-elisp-mode + • xterm-color (and ansi-colors) + • yaml-mode + • yasnippet + + Plus many other miscellaneous faces that are provided by Emacs. + + +File: modus-themes.info, Node: Indirectly covered packages, Prev: Supported packages, Up: Face coverage + +6.2 Indirectly covered packages +=============================== + +These do not require any extra styles because they are configured to +inherit from some basic faces or their dependencies which are directly +supported by the themes. + + • ag + • apropos + • apt-sources-list + • bbdb + • bm + • breakpoint (provided by the built-in ‘gdb-mi.el’ library) + • buffer-expose + • bufler + • counsel-notmuch + • counsel-org-capture-string + • css-mode + • dashboard (emacs-dashboard) + • define-word + • denote + • disk-usage + • dtache + • dynamic-ruler + • easy-kill + • ebdb + • edit-indirect + • egerrit + • elfeed-summary + • evil-owl + • flyspell-correct + • fortran-mode + • freeze-it + • forge + • git-walktree + • goggles + • highlight-defined + • highlight-escape-sequences (‘hes-mode’) + • icomplete-vertical + • i3wm-config-mode + • lin + • minibuffer-line + • no-emoji + • org-remark + • parrot + • perl-mode + • php-mode + • pulsar + • rjsx-mode + • side-hustle + • spell-fu + • swift-mode + • tab-bar-echo-area + • tide + • undo-hl + • vdiff + • vertico-indexed + • vertico-mouse + • xref + + +File: modus-themes.info, Node: Notes on individual packages, Next: Frequently Asked Questions, Prev: Face coverage, Up: Top + +7 Notes on individual packages +****************************** + +This section covers information that may be of interest to users of +individual packages. + +* Menu: + +* Note on calendar.el weekday and weekend colors: Note on calendarel weekday and weekend colors. +* Note on git-gutter in Doom Emacs:: +* Note on php-mode multiline comments:: +* Note on underlines in compilation buffers:: +* Note on inline Latex in Org buffers:: +* Note on dimmer.el: Note on dimmerel. +* Note on display-fill-column-indicator-mode:: +* Note on highlight-parentheses.el: Note on highlight-parenthesesel. +* Note on mmm-mode.el background colors: Note on mmm-modeel background colors. +* Note for prism:: +* Note on company-mode overlay pop-up:: +* Note on ERC escaped color sequences:: +* Note on powerline or spaceline:: +* Note on SHR colors:: +* Note on SHR fonts:: +* Note on Ement colors and fonts:: +* Note on pdf-tools link hints:: +* Note on the Notmuch logo:: +* Note on goto-address-mode faces:: + + +File: modus-themes.info, Node: Note on calendarel weekday and weekend colors, Next: Note on git-gutter in Doom Emacs, Up: Notes on individual packages + +7.1 Note on calendar.el weekday and weekend colors +================================================== + +By default, the ‘M-x calendar’ interface differentiates weekdays from +weekends by applying a gray color to the former and a faint red to the +latter. The idea for this approach is that the weekend should serve as +a subtle warning that no work is supposed to be done on that day, per +the design of traditional calendars. + + Users who prefer all days to look the same can configure the variable +‘calendar-weekend-days’ to either use gray of weekdays or the faint red +of weekends uniformly. + + ;; All are treated like weekdays (gray color) + (setq calendar-weekend-days nil) + + ;; All are treated like weekends (red-faint color) + (setq calendar-weekend-days (number-sequence 0 6)) + + ;; The default marks the Saturday and Sunday as the weekend + (setq calendar-weekend-days '(0 6)) + + For changes to take effect, the Calendar buffer needs to be generated +anew. + + +File: modus-themes.info, Node: Note on git-gutter in Doom Emacs, Next: Note on php-mode multiline comments, Prev: Note on calendarel weekday and weekend colors, Up: Notes on individual packages + +7.2 Note on git-gutter in Doom Emacs +==================================== + +The ‘git-gutter’ and ‘git-gutter-fr’ packages default to drawing bitmaps +for the indicators they display (e.g. bitmap of a plus sign for added +lines). In Doom Emacs, these bitmaps are replaced with contiguous lines +which may look nicer, but require a change to the foreground of the +relevant faces to yield the desired color combinations. + + Since this is Doom-specific, we urge users to apply changes in their +local setup. Below is some sample code, based on what we cover at +length elsewhere in this manual: + + *note Advanced customization::. + + *note Use theme colors in code with modus-themes-with-colors::. + + (defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + ;; Make foreground the same as background for a uniform bar on + ;; Doom Emacs. + ;; + ;; Doom should not be implementing such hacks because themes + ;; cannot support them: + ;; <https://protesilaos.com/codelog/2022-08-04-doom-git-gutter-modus-themes/>. + `(git-gutter-fr:added ((,c :foreground ,bg-added-fringe))) + `(git-gutter-fr:deleted ((,c :foreground ,bg-removed-fringe))) + `(git-gutter-fr:modified ((,c :foreground ,bg-changed-fringe)))))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) + + As always, re-load the theme for changes to take effect. + + If the above does not work, try this instead: + + (after! modus-themes + (modus-themes-with-colors + (custom-set-faces + ;; Make foreground the same as background for a uniform bar on + ;; Doom Emacs. + ;; + ;; Doom should not be implementing such hacks because themes + ;; cannot support them: + ;; <https://protesilaos.com/codelog/2022-08-04-doom-git-gutter-modus-themes/>. + `(git-gutter-fr:added ((,c :foreground ,bg-added-intense))) + `(git-gutter-fr:deleted ((,c :foreground ,bg-removed-intense))) + `(git-gutter-fr:modified ((,c :foreground ,bg-changed-intense)))))) + + +File: modus-themes.info, Node: Note on php-mode multiline comments, Next: Note on underlines in compilation buffers, Prev: Note on git-gutter in Doom Emacs, Up: Notes on individual packages + +7.3 Note on php-mode multiline comments +======================================= + +Depending on your build of Emacs and/or the environment it runs in, +multiline comments in PHP with the ‘php-mode’ package use the +‘font-lock-doc-face’ instead of ‘font-lock-comment-face’. + + This seems to make all comments use the appropriate face: + + (defun my-multine-comments () + (setq-local c-doc-face-name 'font-lock-comment-face)) + + (add-hook 'php-mode-hook #'my-multine-comments) + + As always, re-load the theme for changes to take effect. + + +File: modus-themes.info, Node: Note on underlines in compilation buffers, Next: Note on inline Latex in Org buffers, Prev: Note on php-mode multiline comments, Up: Notes on individual packages + +7.4 Note on underlines in compilation buffers +============================================= + +Various buffers that produce compilation results or run tests on code +apply an underline to the file names they reference or to relevant +messages. Users may consider this unnecessary or excessive. + + To outright disable the effect, use this (buffers need to be +generated anew): + + (setq compilation-message-face nil) + + If some element of differentiation is still desired, a good option is +to render the affected text with the ‘italic’ face: + + (setq compilation-message-face 'italic) + + *note Configure bold and italic faces::. + + +File: modus-themes.info, Node: Note on inline Latex in Org buffers, Next: Note on dimmerel, Prev: Note on underlines in compilation buffers, Up: Notes on individual packages + +7.5 Note on inline Latex in Org buffers +======================================= + +Org can work with inline latex and related syntax. To actually fontify +those constructs, set the variable ‘org-highlight-latex-and-related’ to +the desired list of values (per its doc string). For example: + + (setq org-highlight-latex-and-related '(latex script)) + + Remember to use ‘M-x org-mode-restart’ for changes to take effect. + + +File: modus-themes.info, Node: Note on dimmerel, Next: Note on display-fill-column-indicator-mode, Prev: Note on inline Latex in Org buffers, Up: Notes on individual packages + +7.6 Note on dimmer.el +===================== + +The ‘dimmer.el’ library by Neil Okamoto can be configured to +automatically dim the colors of inactive Emacs windows. To guarantee +consistent results with the Modus themes, we suggest some tweaks to the +default styles, such as in this minimal setup: + + (use-package dimmer + :config + (setq dimmer-fraction 0.3) + (setq dimmer-adjustment-mode :foreground) + (setq dimmer-use-colorspace :rgb) + + (dimmer-mode 1)) + + Of the above, we strongly recommend the RGB color space because it is +the one that remains faithful to the hueness of the colors used by the +themes. Whereas the default CIELAB space has a tendency to distort +colors in addition to applying the dim effect, which can be somewhat +disorienting. + + The value of the ‘dimmer-fraction’ has been selected empirically. +Users might prefer to tweak it further (increasing it makes the dim +effect more pronounced). + + Changing the ‘dimmer-adjustment-mode’ is a matter of preference. +Though because the Modus themes use black and white as their base +colors, any other value for that variable will turn the main background +gray. This inadvertently leads to the opposite of the intended utility +of this package: it draws too much attention to unfocused windows. + + +File: modus-themes.info, Node: Note on display-fill-column-indicator-mode, Next: Note on highlight-parenthesesel, Prev: Note on dimmerel, Up: Notes on individual packages + +7.7 Note on display-fill-column-indicator-mode +============================================== + +The ‘display-fill-column-indicator-mode’ uses a typographic character to +draw its line. This has the downside of creating a dashed line. The +dashes are further apart depending on how tall the font’s glyph height +is and what integer the ‘line-spacing’ is set to. + + At the theme level we eliminate this effect by making the character +one pixel tall: the line is contiguous. Users who prefer the dashed +line are advised to change the ‘fill-column-indicator’ face, as +explained elsewhere in this document. For example: + + (modus-themes-with-colors + (custom-set-faces + `(fill-column-indicator ((,c :foreground ,bg-active))))) + + *note Use theme colors in code with modus-themes-with-colors::. + + To make the line thicker, set the height to be equal to the base font +size instead of the one pixel we use. This is done by specifying a rate +instead of an absolute number, as in ‘:height 1.0’ versus ‘:height 1’. +For example: + + (modus-themes-with-colors + (custom-set-faces + `(fill-column-indicator ((,c :height 1.0 :background ,bg-inactive :foreground ,bg-inactive))))) + + +File: modus-themes.info, Node: Note on highlight-parenthesesel, Next: Note on mmm-modeel background colors, Prev: Note on display-fill-column-indicator-mode, Up: Notes on individual packages + +7.8 Note on highlight-parentheses.el +==================================== + +The ‘highlight-parentheses’ package provides contextual coloration of +surrounding parentheses, highlighting only those which are around the +point. The package expects users to customize the applicable colors on +their own by configuring certain variables. + + To make the Modus themes work as expected with this, we need to use +some of the techniques that are discussed at length in the various +“Do-It-Yourself” (DIY) sections, which provide insight into the more +advanced customization options of the themes. + + *note Advanced customization::. + + In the following example, we are assuming that the user wants to (i) +re-use color variables provided by the themes, (ii) be able to retain +their tweaks while switching between ‘modus-operandi’ and +‘modus-vivendi’, and (iii) have the option to highlight either the +foreground of the parentheses or the background as well. + + We start by defining our own variable, which will serve as a toggle +between foreground and background coloration styles: + + (defvar my-highlight-parentheses-use-background t + "Prefer `highlight-parentheses-background-colors'.") + + Then we can update our preference with this: + + ;; Set to nil to disable backgrounds. + (setq my-highlight-parentheses-use-background nil) + + To re-use colors from the themes, we must wrap our code in the +‘modus-themes-with-colors’ macro. Our implementation must interface +with the variables ‘highlight-parentheses-background-colors’ and/or +‘highlight-parentheses-colors’. + + So we can have something like this (the doc string of +‘modus-themes-with-colors’ explains where the names of the colors can be +found): + + (modus-themes-with-colors + ;; Our preference for setting either background or foreground + ;; styles, depending on `my-highlight-parentheses-use-background'. + (if my-highlight-parentheses-use-background + + ;; Here we set color combinations that involve both a background + ;; and a foreground value. + (setq highlight-parentheses-background-colors (list bg-cyan-intense + bg-magenta-intense + bg-green-intense + bg-yellow-intense) + highlight-parentheses-colors (list cyan + magenta + green + yellow)) + + ;; And here we pass only foreground colors while disabling any + ;; backgrounds. + (setq highlight-parentheses-colors (list green-intense + magenta-intense + blue-intense + red-intense) + highlight-parentheses-background-colors nil))) + + ;; Include this if you also want to make the parentheses bold: + (set-face-attribute 'highlight-parentheses-highlight nil :inherit 'bold) + + ;; Our changes must be evaluated before enabling the relevant mode, so + ;; this comes last. + (global-highlight-parentheses-mode 1) + + For our changes to persist while switching between the Modus themes, +we need to include them in a function which can then get passed to +‘modus-themes-after-load-theme-hook’. This is the complete +implementation: + + ;; Configurations for `highlight-parentheses': + (require 'highlight-parentheses) + + (defvar my-highlight-parentheses-use-background t + "Prefer `highlight-parentheses-background-colors'.") + + (setq my-highlight-parentheses-use-background nil) ; Set to nil to disable backgrounds + + (defun my-modus-themes-highlight-parentheses () + (modus-themes-with-colors + ;; Our preference for setting either background or foreground + ;; styles, depending on `my-highlight-parentheses-use-background'. + (if my-highlight-parentheses-use-background + + ;; Here we set color combinations that involve both a background + ;; and a foreground value. + (setq highlight-parentheses-background-colors (list bg-cyan-intense + bg-magenta-intense + bg-green-intense + bg-yellow-intense) + highlight-parentheses-colors (list cyan + magenta + green + yellow)) + + ;; And here we pass only foreground colors while disabling any + ;; backgrounds. + (setq highlight-parentheses-colors (list green-intense + magenta-intense + blue-intense + red-intense) + highlight-parentheses-background-colors nil))) + + ;; Include this if you also want to make the parentheses bold: + (set-face-attribute 'highlight-parentheses-highlight nil :inherit 'bold) + + ;; Our changes must be evaluated before enabling the relevant mode, so + ;; this comes last. + (global-highlight-parentheses-mode 1)) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-highlight-parentheses) + + As always, re-load the theme for changes to take effect. + + +File: modus-themes.info, Node: Note on mmm-modeel background colors, Next: Note for prism, Prev: Note on highlight-parenthesesel, Up: Notes on individual packages + +7.9 Note on mmm-mode.el background colors +========================================= + +The faces used by ‘mmm-mode.el’ are expected to have a colorful +background, while they should not touch any foreground value. The idea +is that they must not interfere with existing fontification. Those +background colors need to be distinct from each other, such as an +unambiguous red juxtaposed with a clear blue. + + While this design may be internally consistent with the raison d’être +of that library, it inevitably produces inaccessible color combinations. + + There are two competing goals at play: + + 1. Legibility of the text, understood as the contrast ratio between + the background and the foreground. + + 2. Semantic precision of each face which entails faithfulness to + color-coding of the underlying background. + + As the Modus themes are designed with the express purpose of +conforming with the first point, we have to forgo the apparent +color-coding of the background elements. Instead we use subtle colors +that do not undermine the legibility of the affected text while they +still offer a sense of added context. + + Users who might prefer to fall below the minimum 7:1 contrast ratio +in relative luminance (the accessibility target we conform with), can +opt to configure the relevant faces on their own. + + *note Use theme colors in code with modus-themes-with-colors::. + + This example uses more vivid background colors, though it comes at +the very high cost of degraded legibility. + + (modus-themes-with-colors + (custom-set-faces + `(mmm-cleanup-submode-face ((,c :background ,bg-yellow-intense))) + `(mmm-code-submode-face ((,c :background ,bg-inactive))) + `(mmm-comment-submode-face ((,c :background ,bg-blue-intense))) + `(mmm-declaration-submode-face ((,c :background ,bg-cyan-intense))) + `(mmm-default-submode-face ((,c :background ,bg-dim))) + `(mmm-init-submode-face ((,c :background ,bg-magenta-intense))) + `(mmm-output-submode-face ((,c :background ,bg-red-intense))) + `(mmm-special-submode-face ((,c :background ,bg-green-intense))))) + + +File: modus-themes.info, Node: Note for prism, Next: Note on company-mode overlay pop-up, Prev: Note on mmm-modeel background colors, Up: Notes on individual packages + +7.10 Note on prism.el +===================== + +This package by Adam Porter, aka “alphapapa” or “github-alphapapa”, +implements an alternative to the typical coloration of code. Instead of +highlighting the syntactic constructs, it applies color to different +levels of depth in the code structure. + + As ‘prism.el’ offers a broad range of customizations, we cannot style +it directly at the theme level: that would run contrary to the spirit of +the package. Instead, we may offer preset color schemes. Those should +offer a starting point for users to adapt to their needs. + + In the following code snippets, we employ the +‘modus-themes-with-colors’ macro: *note Use theme colors in code with +modus-themes-with-colors::. + + These are the minimum recommended settings with 16 colors: + + (setq prism-num-faces 16) + + (prism-set-colors + :desaturations '(0) ; do not change---may lower the contrast ratio + :lightens '(0) ; same + :colors (modus-themes-with-colors + (list fg-main + magenta + cyan-cooler + magenta-cooler + blue + magenta-warmer + cyan-warmer + red-cooler + green + fg-main + cyan + yellow + blue-warmer + red-warmer + green-cooler + yellow-faint))) + + With 8 colors: + + (setq prism-num-faces 8) + + (prism-set-colors + :desaturations '(0) ; do not change---may lower the contrast ratio + :lightens '(0) ; same + :colors (modus-themes-with-colors + (list blue + magenta + magenta-cooler + cyan-cooler + fg-main + blue-warmer + red-cooler + cyan))) + + And this is with 4 colors, which produces results that are the +closest to the themes’ default aesthetic: + + (setq prism-num-faces 4) + + (prism-set-colors + :desaturations '(0) ; do not change---may lower the contrast ratio + :lightens '(0) ; same + :colors (modus-themes-with-colors + (list blue + magenta + magenta-cooler + green-warmer))) + + If you need to apply desaturation and lightening, you can use what +the ‘prism.el’ documentation recommends, like this (adapting to the +examples with the 4, 8, 16 colors): + + (prism-set-colors + :desaturations (cl-loop for i from 0 below 16 collect (* i 2.5)) + :lightens (cl-loop for i from 0 below 16 collect (* i 2.5)) + :colors (modus-themes-with-colors + (list fg-main + cyan-cooler + magenta-cooler + magenta))) + + +File: modus-themes.info, Node: Note on company-mode overlay pop-up, Next: Note on ERC escaped color sequences, Prev: Note for prism, Up: Notes on individual packages + +7.11 Note on company-mode overlay pop-up +======================================== + +By default, the ‘company-mode’ pop-up that lists completion candidates +is drawn using an overlay. This creates alignment issues every time it +is placed above a piece of text that has a different height than the +default. + + The solution recommended by the project’s maintainer is to use an +alternative front-end for drawing the pop-up which draws child frames +instead of overlays.(1)(2) + + Also consider the ‘corfu’ package. + + ---------- Footnotes ---------- + + (1) <https://github.com/company-mode/company-mode/issues/1010> + + (2) <https://github.com/tumashu/company-posframe/> + + +File: modus-themes.info, Node: Note on ERC escaped color sequences, Next: Note on powerline or spaceline, Prev: Note on company-mode overlay pop-up, Up: Notes on individual packages + +7.12 Note on ERC escaped color sequences +======================================== + +The built-in IRC client ‘erc’ has the ability to colorize any text using +escape sequences that start with ‘^C’ (inserted with ‘C-q C-c’) and are +followed by a number for the foreground and background.(1) Possible +numbers are 0-15, with the first entry being the foreground and the +second the background, separated by a comma. Like this ‘^C1,6’. The +minimum setup is this: + + (add-to-list 'erc-modules 'irccontrols) + (setq erc-interpret-controls-p t + erc-interpret-mirc-color t) + + As this allows users the chance to make arbitrary combinations, it is +impossible to guarantee a consistently high contrast ratio. All we can +we do is provide guidance on the combinations that satisfy the +accessibility standard of the themes: + +Modus Operandi + Use foreground color 1 for all backgrounds from 2-15. Like so: + ‘C-q C-c1’ where ‘N’ is the background. + +Modus Vivendi + Use foreground color 0 for all backgrounds from 2-13. Use + foreground ‘1’ for backgrounds 14, 15. + + Colors 0 and 1 are white and black respectively. So combine them +together, if you must. + + ---------- Footnotes ---------- + + (1) This page explains the basics, though it is not specific to +Emacs: <https://www.mirc.com/colors.html> + + +File: modus-themes.info, Node: Note on powerline or spaceline, Next: Note on SHR colors, Prev: Note on ERC escaped color sequences, Up: Notes on individual packages + +7.13 Note on powerline or spaceline +=================================== + +Both Powerline and Spaceline package users will likely need to use the +command ‘powerline-reset’ whenever they make changes to their themes +and/or mode line setup. + + +File: modus-themes.info, Node: Note on SHR colors, Next: Note on SHR fonts, Prev: Note on powerline or spaceline, Up: Notes on individual packages + +7.14 Note on SHR colors +======================= + +Emacs’ HTML rendering library (‘shr.el’) may need explicit configuration +to respect the theme’s colors instead of whatever specifications the +webpage provides. + + Consult the doc string of ‘shr-use-colors’. + + +File: modus-themes.info, Node: Note on SHR fonts, Next: Note on Ement colors and fonts, Prev: Note on SHR colors, Up: Notes on individual packages + +7.15 Note on SHR fonts +====================== + +By default, packages that build on top of the Simple HTML Remember +(‘shr’) use proportionately spaced fonts. This is controlled by the +user option ‘shr-use-fonts’, which is set to non-‘nil’ by default. To +use the standard font instead, set that variable to ‘nil’. + + *note Font configurations for Org and others::. + + Packages affected by this are: + + • elfeed + • ement + • eww + + This is a non-exhaustive list. + + +File: modus-themes.info, Node: Note on Ement colors and fonts, Next: Note on pdf-tools link hints, Prev: Note on SHR fonts, Up: Notes on individual packages + +7.16 Note on Ement colors and fonts +=================================== + +The ‘ement.el’ library by Adam Porter (also known as “alphapapa”) +defaults to a method of colorizing usernames in a rainbow style. This +is controlled by the user option ‘ement-room-prism’ and can be disabled +with: + + (setq ement-room-prism nil) + + The contrast ratio of these colors is governed by another user +option: ‘ement-room-prism-minimum-contrast’. By default, it is set to 6 +which is slightly below our nominal target. Try this instead: + + (setq ement-room-prism-minimum-contrast 7) + + With regard to fonts, Ement depends on ‘shr’ (*note Note on SHR +fonts::). + + Since we are here, here is an excerpt from Ement’s source code: + + (defcustom ement-room-prism-minimum-contrast 6 + "Attempt to enforce this minimum contrast ratio for user faces. + This should be a reasonable number from, e.g. 0-7 or so." + ;; Prot would almost approve of this default. :) I would go all the way + ;; to 7, but 6 already significantly dilutes the colors in some cases. + :type 'number) + + Yes, I do approve of that default. Even a 4.5 (the WCAG AA rating) +would be a good baseline for many themes and/or user configurations. +Our target is the highest of the sort, though we do not demand that +everyone conforms with it. + + +File: modus-themes.info, Node: Note on pdf-tools link hints, Next: Note on the Notmuch logo, Prev: Note on Ement colors and fonts, Up: Notes on individual packages + +7.17 Note on pdf-tools link hints +================================= + +Hints are drawn by ImageMagick (https://imagemagick.org/), not Emacs, +i.e., ImageMagick doesn’t know about the hint face unless you tell +ImageMagick about it. By default, only the foreground and background +color attributes are passed. The below snippet adds to those the +various font attributes. As it queries various faces, specifically +‘pdf-links-read-link’ and the faces it inherits, it needs to be added to +your initialization file after you’ve customized any faces. + + (use-package pdf-links + :config + (let ((spec + (apply #'append + (mapcar + (lambda (name) + (list name + (face-attribute 'pdf-links-read-link + name nil 'default))) + '(:family :width :weight :slant))))) + (setq pdf-links-read-link-convert-commands + `("-density" "96" + "-family" ,(plist-get spec :family) + "-stretch" ,(let* ((width (plist-get spec :width)) + (name (symbol-name width))) + (replace-regexp-in-string "-" "" + (capitalize name))) + "-weight" ,(pcase (plist-get spec :weight) + ('ultra-light "Thin") + ('extra-light "ExtraLight") + ('light "Light") + ('semi-bold "SemiBold") + ('bold "Bold") + ('extra-bold "ExtraBold") + ('ultra-bold "Black") + (_weight "Normal")) + "-style" ,(pcase (plist-get spec :slant) + ('italic "Italic") + ('oblique "Oblique") + (_slant "Normal")) + "-pointsize" "%P" + "-undercolor" "%f" + "-fill" "%b" + "-draw" "text %X,%Y '%c'")))) + + +File: modus-themes.info, Node: Note on the Notmuch logo, Next: Note on goto-address-mode faces, Prev: Note on pdf-tools link hints, Up: Notes on individual packages + +7.18 Note on the Notmuch logo +============================= + +By default, the “hello” buffer of Notmuch includes a header with the +programs’ logo and a couple of buttons. The logo has the effect of +enlarging the height of the line, which negatively impacts the shape of +those buttons. Disabling the logo fixes the problem: + + (setq notmuch-show-logo nil) + + +File: modus-themes.info, Node: Note on goto-address-mode faces, Prev: Note on the Notmuch logo, Up: Notes on individual packages + +7.19 Note on goto-address-mode faces +==================================== + +The built-in ‘goto-address-mode’ uses heuristics to identify URLs and +email addresses in the current buffer. It then applies a face to them +to change their style. Some packages, such as ‘notmuch’, use this +minor-mode automatically. + + The faces are not declared with ‘defface’, meaning that it is better +that the theme does not modify them. The user is thus encouraged to +consider including (or equivalent) this in their setup: + + (setq goto-address-url-face 'link + goto-address-url-mouse-face 'highlight + goto-address-mail-face 'link + goto-address-mail-mouse-face 'highlight) + + My personal preference is to set ‘goto-address-mail-face’ to ‘nil’, +as it otherwise adds too much visual noise to the buffer (email +addresses stand out more, due to the use of the uncommon ‘@’ character +but also because they are often enclosed in angled brackets). + + +File: modus-themes.info, Node: Frequently Asked Questions, Next: Contributing, Prev: Notes on individual packages, Up: Top + +8 Frequently Asked Questions +**************************** + +In this section we provide answers related to some aspects of the Modus +themes’ design and application. + +* Menu: + +* Is the contrast ratio about adjacent colors?:: +* What does it mean to avoid exaggerations?:: +* Why are colors mostly variants of blue, magenta, cyan?: Why are colors mostly variants of blue magenta cyan?. +* What is the best setup for legibility?:: +* Are these color schemes?:: +* Port the Modus themes to other platforms?:: + + +File: modus-themes.info, Node: Is the contrast ratio about adjacent colors?, Next: What does it mean to avoid exaggerations?, Up: Frequently Asked Questions + +8.1 Is the contrast ratio about adjacent colors? +================================================ + +The minimum contrast ratio in relative luminance that the themes conform +with always refers to any given combination of background and foreground +colors. If we have some blue colored text next to a magenta one, both +against a white background, we do not mean to imply that blue:magenta is +7:1 in terms of relative luminance. Rather, we state that blue:white +and magenta:white each are 7:1 or higher. + + The point of reference is always the background. Because colors have +about the same minimum distance in luminance from their backdrop, they +necessarily are fairly close to each other in this measure. A possible +blue:magenta combination would naturally be around 1:1 in contrast of +the sort here considered. + + To differentiate between sequential colors, we rely on hueness by +mapping contrasting hues to adjacent constructs, while avoiding +exaggerations. A blue next to a magenta can be told apart regardless of +their respective contrast ratio against their common background. +Exceptions would be tiny characters in arguably not so realistic cases, +such as two dots drawn side-by-side which for some reason would need to +be colored differently. They would still be legible though, which is +the primary objective of the Modus themes. + + +File: modus-themes.info, Node: What does it mean to avoid exaggerations?, Next: Why are colors mostly variants of blue magenta cyan?, Prev: Is the contrast ratio about adjacent colors?, Up: Frequently Asked Questions + +8.2 What does it mean to avoid exaggerations? +============================================= + +The Modus themes are designed with restraint, so that their default +looks do not overdo it with the application of color. + + *note Customization Options: Customization options. + + This is the non-quantifiable aspect of the themes’ design: the +artistic part, if you will. There are a lot of cases where color can be +used inconsiderately, without accounting for layout, typographic, or +other properties of the presentation. For example, two headings with +distinct markers, such as leading asterisks in Org buffers, do not have +to have highly contrasting hues between them in order to be told apart: +the added element of contrast in hueness does not contribute +significantly more to the distinction between the headings than colors +whose hues are relatively closer to each other in the color space. + + Exaggerations can be hard to anticipate or identify. Multiple shades +of blue and magenta in the same context may not seem optimal: one might +think that it would be better to use highly contrasting hues to ensure +that all colors stand out, such as by placing blue next to yellow, next +to magenta, and green. That would, however, be a case of design for its +own sake; a case where color is being applied without consideration of +its end results in the given context. Too many contrasting hues in +close proximity force an erratic rate to how the eye jumps from one +piece of text to the next. Whereas multiple shades of, say, blue and +magenta can suffice to tell things apart and avoid excess coloration: a +harmonious rhythm. + + +File: modus-themes.info, Node: Why are colors mostly variants of blue magenta cyan?, Next: What is the best setup for legibility?, Prev: What does it mean to avoid exaggerations?, Up: Frequently Asked Questions + +8.3 Why are colors mostly variants of blue, magenta, cyan? +========================================================== + +Due to the innate properties of color, some options are better than +others for the accessibility purposes of the themes, the stylistic +consistency between ‘modus-operandi’ and ‘modus-vivendi’, and the +avoidance of exaggerations in design. + + *note What does it mean to avoid exaggerations?:: + + What we describe as color is a function of three distinct channels of +light: red, green, blue. In hexadecimal RGB notation, a color value is +read as three pairs of red, green, and blue light: ‘#RRGGBB’. Of those +three, the most luminant is green, while the least luminant is blue. + + The three basic colors represent each of the channels of light. They +can be intermixed to give us six colors: red and green derive yellow, +green and blue make cyan, red and blue turn into magenta. + + We can test the luminance of each of those against white and black to +get a sense of how not all colors are equally good for accessibility +(white is ‘#ffffff’, which means that all three light channels are fully +luminated, while black is ‘#000000’ meaning that no light is present +(notwithstanding display technology)). + + | Name | | #ffffff | #000000 | + |---------+---------+---------+---------| + | red | #ff0000 | 4.00 | 5.25 | + | yellow | #ffff00 | 1.07 | 19.56 | + | green | #00ff00 | 1.37 | 15.30 | + | cyan | #00ffff | 1.25 | 16.75 | + | blue | #0000ff | 8.59 | 2.44 | + | magenta | #ff00ff | 3.14 | 6.70 | + + *note Measure color contrast::. + + By reading this table we learn that every color that has a high level +of green light (green, yellow, cyan) is virtually unreadable against a +white background and, conversely, can be easily read against black. + + We can then infer that red and blue, in different combinations, with +green acting as calibrator for luminance, will give us fairly moderate +colors that pass the 7:1 target. Blue with a bit of green produce +appropriate variants of cyan. Similarly, blue combined with some red +and hints of green give us suitable shades of purple. + + Due to the need of maintaining some difference in hueness between +adjacent colors, it is not possible to make red, green, and yellow the +main colors, because blue cannot be used to control their luminance and, +thus the relevant space will shrink considerably. + + *note Is the contrast ratio about adjacent colors?:: + + This phenomenon is best illustrated by the following table that +measures the relative luminance of shades of red, yellow, magenta +against white: + + | | #ffffff | + |---------+---------| + | #990000 | 8.92 | + | #995500 | 5.75 | + | #990099 | 7.46 | + + We notice that equal values of red and blue light in ‘#990099’ +(magenta shade) do not lead to a considerable change in luminance +compared with ‘#990000’ (red variant). Whereas less amount of green +light in ‘#995500’ leads to a major drop in luminance relative to white. +It follows that using the green channel of light to calibrate the +luminance of colors is more effective than trying to do the same with +either red or blue (the latter is the least effective in that regard). + + When we need to work with several colors, it is always better to have +sufficient manoeuvring space, especially since we cannot pick arbitrary +colors but only those that satisfy the accessibility objectives of the +themes. + + As for why we do not mostly use green, yellow, cyan for the dark +theme, it is because those colors are far more luminant than their +counterparts on the other side of the spectrum, so to ensure that they +all have about the same contrast ratios we would have to alter their +hueness considerably. In short, the effect would not be optimal as it +would lead to exaggerations. Plus, it would make ‘modus-vivendi’ look +completely different than ‘modus-operandi’, to the effect that the two +could not be properly considered part of the same project. + + +File: modus-themes.info, Node: What is the best setup for legibility?, Next: Are these color schemes?, Prev: Why are colors mostly variants of blue magenta cyan?, Up: Frequently Asked Questions + +8.4 What is the best setup for legibility? +========================================== + +The Modus themes can be conceptually simplified as combinations of color +values that account for relative luminance and inner harmony. Those +qualities do not guarantee that every end-user will have the same +experience, due to differences between people, but also because of +variances in hardware capabilities and configurations. For the purposes +of this document, we may only provide suggestions pertaining to the +latter case. + + ‘modus-operandi’ is best used outdoors or in a room that either gets +direct sunlight or has plenty of light. Whereas ‘modus-vivendi’ works +better when there is not a lot of sunshine or the room has a source of +light that is preferably a faint and/or warm one. It is possible to use +‘modus-operandi’ at night and ‘modus-vivendi’ during the day, though +that will depend on several variables, such as one’s overall perception +of color, the paint on the walls and how that contributes to the +impression of lightness in the room, the sense of space within the eye’s +peripheral vision, hardware specifications, and environmental factors. + + In general, an additional source of light other than that of the +monitor can help reduce eye strain: the eyes are more relaxed when they +do not have to focus on one point to gather light. + + The monitor’s display settings must be accounted for. Gamma values, +in particular, need to be calibrated to neither amplify nor distort the +perception of black. Same principle for sharpness, brightness, and +contrast as determined by the hardware, which all have an effect on how +text is read on the screen. + + There are software level methods on offer, such as the XrandR utility +for the X Window System (X.org), which can make gamma corrections for +each of the three channels of light (red, green, blue). For example: + + xrandr --output LVDS1 --brightness 1.0 --gamma 0.76:0.75:0.68 + + Typography is another variable. Some font families are blurry at +small point sizes. Others may have a regular weight that is lighter +(thiner) than that of their peers which may, under certain +circumstances, cause a halo effect around each glyph. + + The gist is that legibility cannot be fully solved at the theme +level. The color combinations may have been optimized for +accessibility, though the remaining contributing factors in each case +need to be considered in full. + + +File: modus-themes.info, Node: Are these color schemes?, Next: Port the Modus themes to other platforms?, Prev: What is the best setup for legibility?, Up: Frequently Asked Questions + +8.5 Are these color schemes? +============================ + +No, the Modus themes are not color schemes. + + A color scheme is a collection of colors. A good color scheme is a +combination of colors with an inner logic or abstract structure. + + A theme is a set of patterns that are applied across different +contexts. A good theme is one that does so with consistency, though not +uniformity. + + In practical terms, a color scheme is what one uses when, for +example, they replace the first sixteen escape sequences of a terminal +emulator with color values of their preference. The terminal offers the +option to choose, say, the exact value of what counts as “red”, but does +not provide the means to control where that is mapped to and whether it +should also have other qualities such as a bold weight for the +underlying text or an added background color. In contradistinction, +Emacs uses constructs known as “faces” which allow the user/developer to +specify where a given color will be used and whether it should be +accompanied by other typographic or stylistic attributes. + + By configuring the multitude of faces on offer we thus control both +which colors are applied and how they appear in their context. When a +package wants to render each instance of “foo” with the “bar” face, it +is not requesting a specific color, which makes things considerably more +flexible as we can treat “bar” in its own right without necessarily +having to use some color value that we hardcoded somewhere. + + Which brings us to the distinction between consistency and uniformity +where our goal is always the former: we want things to look similar +across all interfaces, but we must never force a visual identity where +that runs contrary to the functionality of the given interface. For +instance, all links are underlined by default yet there are cases such +as when viewing listings of emails in Gnus (and Mu4e, Notmuch) where (i) +it is already understood that one must follow the indicator or headline +to view its contents and (ii) underlining everything would make the +interface virtually unusable. + + Again, one must exercise judgement in order to avoid discrimination, +where “discrimination” refers to: + + • The treatment of substantially different magnitudes as if they were + of the same class. + • Or the treatment of the same class of magnitudes as if they were of + a different class. + + (To treat similar things differently; to treat dissimilar things +alike.) + + If, in other words, one is to enforce uniformity without accounting +for the particular requirements of each case—the contextual demands for +usability beyond matters of color—they are making a not-so-obvious error +of treating different cases as if they were the same. + + The Modus themes prioritize “thematic consistency” over abstract +harmony or regularity among their applicable colors. In concrete terms, +we do not claim that, say, our yellows are the best complements for our +blues because we generally avoid using complementary colors +side-by-side, so it is wrong to optimize for a decontextualised +blue+yellow combination. Not to imply that our colors do not work well +together because they do, just to clarify that consistency of context is +what themes must strive for, and that requires widening the scope of the +design beyond the particularities of a color scheme. + + Long story short: color schemes and themes have different +requirements. Please do not conflate the two. + + +File: modus-themes.info, Node: Port the Modus themes to other platforms?, Prev: Are these color schemes?, Up: Frequently Asked Questions + +8.6 Port the Modus themes to other platforms? +============================================= + +There is no plan to port the themes to other platforms or text editors. +I (Protesilaos) only use GNU Emacs and thus cannot maintain code that +targets software I am either not familiar with or am not using on a +daily basis. + + While it is possible to produce a simulacrum based on a given +template, doing so would run contrary to how this project is maintained +where details matter greatly. + + Each program has its own requirements so it won’t always be +possible—or indeed desirable—to have 1:1 correspondence between what +applies to Emacs and what should be done elsewhere. No port should ever +strive to be a copy of the Emacs implementation, as no other program is +an Emacs equivalent, but instead try to follow the spirit of the design. +For example, some of the customization options accept a list as their +value, or an alist, which may not be possible to reproduce on other +platforms. + + *note Customization options::. + + In other words, if something must be done differently on a certain +editor then that is acceptable so long as (i) the accessibility +standards are not compromised and (ii) the overall character of the +themes remains consistent. + + The former criterion should be crystal clear as it pertains to the +scientific foundations of the themes: high legibility and taking care of +the needs of users with red-green/blue-yellow color deficiency +(deuteranopia and tritanopia) by avoiding red+green color coding +paradigms and/or by providing yellow+blue variants for deuteranopia and +red+cyan for tritanopia (*note Overview::). + + The latter criterion is the “je ne sais quoi” of the artistic aspect +of the themes, which is partially fleshed out in this manual. + + *note Frequently Asked Questions::. + + With regard to the artistic aspect (where “art” qua skill may amount +to an imprecise science), there is no hard-and-fast rule in effect as it +requires one to exercize discretion and make decisions based on +context-dependent information or constraints. As is true with most +things in life, when in doubt, do not cling on to the letter of the law +but try to understand its spirit. + + For a trivial example: the curly underline that Emacs draws for +spelling errors is thinner than, e.g., what a graphical web browser has, +so if I was to design for an editor than has a thicker curly underline I +would make the applicable colors less intense to counterbalance the +typographic intensity of the added thickness. + + With those granted, if anyone is willing to develop a port of the +themes, they are welcome to contact me and I will do my best to help +them in their efforts. + + +File: modus-themes.info, Node: Contributing, Next: Acknowledgements, Prev: Frequently Asked Questions, Up: Top + +9 Contributing +************** + +This section documents the canonical sources of the themes and the ways +in which you can contribute to their ongoing development. + +* Menu: + +* Sources of the themes:: +* Issues you can help with:: +* Patches require copyright assignment to the FSF:: + + +File: modus-themes.info, Node: Sources of the themes, Next: Issues you can help with, Up: Contributing + +9.1 Sources of the themes +========================= + + • Package name (GNU ELPA): ‘modus-themes’ + • Official manual: <https://protesilaos.com/emacs/modus-themes> + • Change log: <https://protesilaos.com/emacs/modus-themes-changelog> + • Color palette: <https://protesilaos.com/emacs/modus-themes-colors> + • Sample pictures: + <https://protesilaos.com/emacs/modus-themes-pictures> + • Git repo on SourceHut: + <https://git.sr.ht/~protesilaos/modus-themes> + • Mirrors: + • GitHub: <https://github.com/protesilaos/modus-themes> + • GitLab: <https://gitlab.com/protesilaos/modus-themes> + • Mailing list: <https://lists.sr.ht/~protesilaos/modus-themes> + • Backronym: My Old Display Unexpectedly Sharpened ... themes + + +File: modus-themes.info, Node: Issues you can help with, Next: Patches require copyright assignment to the FSF, Prev: Sources of the themes, Up: Contributing + +9.2 Issues you can help with +============================ + +A few tasks you can help with by sending an email to the general +modus-themes public mailing list +(https://lists.sr.ht/~protesilaos/modus-themes). + + • Suggest refinements to packages that are covered. + • Report packages not covered thus far. + • Report bugs, inconsistencies, shortcomings. + • Help expand the documentation of covered-but-not-styled packages. + • Suggest refinements to the color palette. + • Help expand this document or any other piece of documentation. + • Send patches for code refinements (if you need, ask me for help + with Git—we all start out as beginners). + + *note Patches require copyright assignment to the FSF::. + + It is preferable that your feedback includes some screenshots, GIFs, +or short videos, as well as further instructions to reproduce a given +setup. Though this is not a requirement. + + Whatever you do, bear in mind the overarching objective of the Modus +themes: to keep a contrast ratio that is greater or equal to 7:1 between +background and foreground colors. If a compromise is ever necessary +between aesthetics and accessibility, it shall always be made in the +interest of the latter. + + +File: modus-themes.info, Node: Patches require copyright assignment to the FSF, Prev: Issues you can help with, Up: Contributing + +9.3 Patches require copyright assignment to the FSF +=================================================== + +Code contributions are most welcome. For any major edit (more than 15 +lines, or so, in aggregate per person), you need to make a copyright +assignment to the Free Software Foundation. This is necessary because +the themes are part of the upstream Emacs distribution: the FSF must at +all times be in a position to enforce the GNU General Public License. + + Copyright assignment is a simple process. Check the request form +below (please adapt it accordingly). You must write an email to the +address mentioned in the form and then wait for the FSF to send you a +legal agreement. Sign the document and file it back to them. This +could all happen via email and take about a week. You are encouraged to +go through this process. You only need to do it once. It will allow +you to make contributions to Emacs in general. + + Please email the following information to assign@gnu.org, and we + will send you the assignment form for your past and future changes. + + Please use your full legal name (in ASCII characters) as the subject + line of the message. + + REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES + + [What is the name of the program or package you're contributing to?] + + GNU Emacs + + [Did you copy any files or text written by someone else in these changes? + Even if that material is free software, we need to know about it.] + + Copied a few snippets from the same files I edited. Their author, + Protesilaos Stavrou, has already assigned copyright to the Free Software + Foundation. + + [Do you have an employer who might have a basis to claim to own + your changes? Do you attend a school which might make such a claim?] + + + [For the copyright registration, what country are you a citizen of?] + + + [What year were you born?] + + + [Please write your email address here.] + + + [Please write your postal address here.] + + + + + + [Which files have you changed so far, and which new files have you written + so far?] + + + +File: modus-themes.info, Node: Acknowledgements, Next: GNU Free Documentation License, Prev: Contributing, Up: Top + +10 Acknowledgements +******************* + +The Modus themes are a collective effort. Every bit of work matters. + +Author/maintainer + Protesilaos Stavrou. + +Contributions to code or documentation + Aleksei Gusev, Alex Griffin, Anders Johansson, Antonio Ruiz, Basil + L. Contovounesios, Björn Lindström, Carlo Zancanaro, Christian + Tietze, Daniel Mendler, David Edmondson, Eli Zaretskii, Fritz + Grabo, Gautier Ponsinet, Illia Ostapyshyn, Kévin Le Gouguec, Koen + van Greevenbroek, Kostadin Ninev, Madhavan Krishnan, Manuel Giraud, + Markus Beppler, Matthew Stevenson, Mauro Aranda, Nacho Barrientos, + Nicolas De Jaeghere, Paul David, Philip Kaludercic, Pierre + Téchoueyres, Rudolf Adamkovič, Sergey Nichiporchik, Shreyas + Ragavan, Stefan Kangas, Stephen Berman, Stephen Gildea, Steve + Downey, Tomasz Hołubowicz, Utkarsh Singh, Vincent Murphy, Xinglu + Chen, Yuanchen Xie, fluentpwn, okamsn. + +Ideas and user feedback + Aaron Jensen, Adam Porter, Adam Spiers, Adrian Manea, Aleksei + Pirogov, Alex Griffin, Alex Koen, Alex Peitsinis, Alexey Shmalko, + Alok Singh, Anders Johansson, André Alexandre Gomes, Andrew Tropin, + Antonio Hernández Blas, Arif Rezai, Augusto Stoffel, Basil L. + Contovounesios, Bernd Rellermeyer, Burgess Chang, Charlotte Van + Petegem, Christian Tietze, Christopher Dimech, Christopher League, + Damien Cassou, Daniel Mendler, Dario Gjorgjevski, David Edmondson, + Davor Rotim, Divan Santana, Eliraz Kedmi, Emanuele Michele Alberto + Monterosso, Farasha Euker, Feng Shu, Gautier Ponsinet, Gerry + Agbobada, Gianluca Recchia, Gonçalo Marrafa, Guilherme Semente, + Gustavo Barros, Hörmetjan Yiltiz, Ilja Kocken, Imran Khan, Iris + Garcia, Ivan Popovych, James Ferguson, Jeremy Friesen, Jerry Zhang, + Johannes Grødem, John Haman, Jonas Collberg, Jorge Morais, Joshua + O’Connor, Julio C. Villasante, Kenta Usami, Kevin Fleming, Kévin + Le Gouguec, Kevin Kainan Li, Kostadin Ninev, Laith Bahodi, Lasse + Lindner, Len Trigg, Lennart C. Karssen, Luis Miguel Castañeda, + Magne Hov, Manuel Giraud, Manuel Uberti, Mark Bestley, Mark Burton, + Mark Simpson, Marko Kocic, Markus Beppler, Matt Armstrong, Matthias + Fuchs, Mattias Engdegård, Mauro Aranda, Maxime Tréca, Michael + Goldenberg, Morgan Smith, Morgan Willcock, Murilo Pereira, Nicky + van Foreest, Nicolas De Jaeghere, Nicolas Semrau, Olaf Meeuwissen, + Oliver Epper, Pablo Stafforini, Paul Poloskov, Pengji Zhang, Pete + Kazmier, Peter Wu, Philip Kaludercic, Pierre Téchoueyres, + Przemysław Kryger, Robert Hepple, Roman Rudakov, Russell Sim, Ryan + Phillips, Rytis Paškauskas, Rudolf Adamkovič, Sam Kleinman, Samuel + Culpepper, Saša Janiška, Shreyas Ragavan, Simon Pugnet, Steve + Downey, Tassilo Horn, Thanos Apollo, Thibaut Verron, Thomas + Heartman, Togan Muftuoglu, Tony Zorman, Trey Merkley, Tomasz + Hołubowicz, Toon Claes, Uri Sharf, Utkarsh Singh, Vincent Foley, + Zoltan Kiraly. As well as users: Ben, CsBigDataHub1, Emacs + Contrib, Eugene, Fourchaux, Fredrik, Moesasji, Nick, Summer Emacs, + TheBlob42, TitusMu, Trey, bepolymathe, bit9tream, bangedorrunt, + derek-upham, doolio, fleimgruber, gitrj95, iSeeU, jixiuf, okamsn, + pRot0ta1p, soaringbird, tumashu, wakamenod. + +Packaging + Basil L. Contovounesios, Eli Zaretskii, Glenn Morris, Mauro Aranda, + Richard Stallman, Stefan Kangas (core Emacs), Stefan Monnier (GNU + Elpa), André Alexandre Gomes, Andrew Tropin, Dimakakos Dimos, + Morgan Smith, Nicolas Goaziou (Guix), Dhavan Vaidya (Debian). + +Inspiration for certain features + Bozhidar Batsov (zenburn-theme), Fabrice Niessen (leuven-theme). + + Special thanks (from A-Z) to Daniel Mendler, Gustavo Barros, Manuel +Uberti, Nicolas De Jaeghere, and Omar Antolín Camarena for their long +time contributions and insightful commentary on key aspects of the +themes’ design and/or aspects of their functionality. + + All errors are my own. + + +File: modus-themes.info, Node: GNU Free Documentation License, Next: Indices, Prev: Acknowledgements, Up: Top + +Appendix A GNU Free Documentation License +***************************************** + + Version 1.3, 3 November 2008 + + Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + <https://fsf.org/> + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document “free” in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of “copyleft”, which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + “Document”, below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as “you”. You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A “Modified Version” of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A “Secondary Section” is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document’s overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The “Invariant Sections” are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The “Cover Texts” are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A “Transparent” copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + “Transparent” is called “Opaque”. + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The “Title Page” means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, “Title + Page” means the text near the most prominent appearance of the + work’s title, preceding the beginning of the body of the text. + + The “publisher” means any person or entity that distributes copies + of the Document to the public. + + A section “Entitled XYZ” means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) + To “Preserve the Title” of such a section when you modify the + Document means that it remains a section “Entitled XYZ” according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document’s license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document’s + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled “History”, Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled “History” in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + “History” section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled “Acknowledgements” or “Dedications”, + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled “Endorsements”. Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + “Endorsements” or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version’s + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled “Endorsements”, provided it contains + nothing but endorsements of your Modified Version by various + parties—for example, statements of peer review or that the text has + been approved by an organization as the authoritative definition of + a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + “History” in the various original documents, forming one section + Entitled “History”; likewise combine any sections Entitled + “Acknowledgements”, and any sections Entitled “Dedications”. You + must delete all sections Entitled “Endorsements.” + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an “aggregate” if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation’s users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document’s Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled “Acknowledgements”, + “Dedications”, or “History”, the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + <https://www.gnu.org/licenses/>. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License “or any later version” applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy’s public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A “Massive Multiauthor Collaboration” (or “MMC”) contained in the + site means any set of copyrightable works thus published on the MMC + site. + + “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + “Incorporate” means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is “eligible for relicensing” if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the “with...Texts.” line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + +File: modus-themes.info, Node: Indices, Prev: GNU Free Documentation License, Up: Top + +B Indices +********* + +* Menu: + +* Function index:: +* Variable index:: +* Concept index:: + + +File: modus-themes.info, Node: Function index, Next: Variable index, Up: Indices + +B.1 Function index +================== + + +* Menu: + +* modus-themes-contrast: Measure color contrast. + (line 6) +* modus-themes-get-color-value: Get a single color from the palette. + (line 8) +* modus-themes-list-colors: Preview theme colors. (line 6) +* modus-themes-list-colors-current: Preview theme colors. (line 12) +* modus-themes-load-theme: Enable and load. (line 6) +* modus-themes-preview-colors: Preview theme colors. (line 25) +* modus-themes-preview-colors-current: Preview theme colors. (line 25) +* modus-themes-toggle: Enable and load. (line 6) +* modus-themes-wcag-formula: Measure color contrast. + (line 6) +* modus-themes-with-colors: Use theme colors in code with modus-themes-with-colors. + (line 12) + + +File: modus-themes.info, Node: Variable index, Next: Concept index, Prev: Function index, Up: Indices + +B.2 Variable index +================== + + +* Menu: + +* modus-operandi-deuteranopia-palette-overrides: Palette overrides. + (line 30) +* modus-operandi-palette-overrides: Palette overrides. (line 28) +* modus-operandi-tinted-palette-overrides: Palette overrides. (line 32) +* modus-operandi-tritanopia-palette-overrides: Palette overrides. + (line 34) +* modus-themes-after-load-theme-hook: Enable and load. (line 6) +* modus-themes-bold-constructs: Bold constructs. (line 6) +* modus-themes-common-palette-overrides: Palette overrides. (line 22) +* modus-themes-completions: Completion UIs. (line 6) +* modus-themes-custom-auto-reload: Custom reload theme. (line 6) +* modus-themes-disable-other-themes: Disable other themes. (line 6) +* modus-themes-headings: Heading styles. (line 6) +* modus-themes-italic-constructs: Italic constructs. (line 6) +* modus-themes-mixed-fonts: Mixed fonts. (line 6) +* modus-themes-org-blocks: Org mode blocks. (line 6) +* modus-themes-preset-overrides-cooler: Palette override presets. + (line 29) +* modus-themes-preset-overrides-faint: Palette override presets. + (line 16) +* modus-themes-preset-overrides-intense: Palette override presets. + (line 25) +* modus-themes-preset-overrides-warmer: Palette override presets. + (line 29) +* modus-themes-prompts: Command prompts. (line 6) +* modus-themes-variable-pitch-ui: UI typeface. (line 6) +* modus-vivendi-deuteranopia-palette-overrides: Palette overrides. + (line 38) +* modus-vivendi-palette-overrides: Palette overrides. (line 36) +* modus-vivendi-tinted-palette-overrides: Palette overrides. (line 40) +* modus-vivendi-tritanopia-palette-overrides: Palette overrides. + (line 42) + + +File: modus-themes.info, Node: Concept index, Prev: Variable index, Up: Indices + +B.3 Concept index +================= + + +* Menu: + +* Avoiding exaggerations in design: What does it mean to avoid exaggerations?. + (line 6) +* Bold and italic fonts: Configure bold and italic faces. + (line 6) +* Changelog: Learn about the latest changes. + (line 6) +* Color accuracy of terminal emulators: More accurate colors in terminal emulators. + (line 6) +* Color contrast: Measure color contrast. + (line 6) +* Contrast between adjacent colors: Is the contrast ratio about adjacent colors?. + (line 6) +* Contributing: Issues you can help with. + (line 6) +* Contributors: Acknowledgements. (line 6) +* Essential configuration: Enable and load. (line 6) +* Explicitly supported packages: Supported packages. (line 6) +* Font configurations: Font configurations for Org and others. + (line 6) +* Fonts in EWW, Elfeed, Ement, and SHR: Note on SHR fonts. (line 6) +* Frequently Asked Questions: Frequently Asked Questions. + (line 6) +* General setup for readability: What is the best setup for legibility?. + (line 6) +* Implicitly supported packages: Indirectly covered packages. + (line 6) +* Innate color qualities of the palette: Why are colors mostly variants of blue magenta cyan?. + (line 6) +* load-theme VS enable-theme: Differences between loading and enabling. + (line 6) +* Org custom emphasis faces: Custom Org emphasis faces. + (line 6) +* Org custom todo faces: Custom Org todo keyword and priority faces. + (line 6) +* Porting the themes to other editors: Port the Modus themes to other platforms?. + (line 6) +* Preview named colors or semantic color mappings: Preview theme colors. + (line 6) +* Pure white and pure black in terminal emulators: Range of color with terminal emulators. + (line 6) +* Remapping faces: Remap face with local value. + (line 6) +* Remapping pdf-tools backdrop: Backdrop for pdf-tools. + (line 6) +* sample configuration: Sample configuration with and without use-package. + (line 6) +* Screenshots: How do the themes look like. + (line 6) +* Sources of the themes: Sources of the themes. (line 6) +* Switch themes without load-theme: Toggle themes without reloading them. + (line 6) +* Themes, not color schemes: Are these color schemes?. + (line 6) +* Use colors from the palette anywhere: Use theme colors in code with modus-themes-with-colors. + (line 6) +* use-package configuration: Sample configuration with and without use-package. + (line 6) + + + +Tag Table: +Node: Top874 +Node: Overview8129 +Node: How do the themes look like10901 +Node: Learn about the latest changes11260 +Node: Installation11648 +Node: Install manually from source12578 +Node: Install from the archives13403 +Node: Install on GNU/Linux14002 +Node: Debian 11 Bullseye14495 +Node: GNU Guix14905 +Node: Dealing with byte compilation errors15188 +Node: Enable and load16346 +Node: The require-theme for built-in Emacs themes19200 +Node: Sample configuration with and without use-package20320 +Node: Differences between loading and enabling23231 +Node: Customization options25269 +Node: Custom reload theme29017 +Node: Disable other themes29937 +Node: Bold constructs31135 +Node: Italic constructs31972 +Node: Mixed fonts32743 +Node: Command prompts33739 +Node: Completion UIs35544 +Node: Org mode blocks38346 +Node: Heading styles40251 +Node: UI typeface44605 +Node: Palette overrides45536 +Node: Advanced customization49871 +Node: Palette override presets51534 +Node: Stylistic variants using palette overrides54326 +Node: Make the mode line borderless56238 +Node: Make the active mode line colorful57840 +Node: Make the tab bar more or less colorful59785 +Node: Make the fringe invisible or another color62016 +Node: Make links use subtle or no underlines63510 +Node: Make prompts more or less colorful64507 +Node: Make completion matches more or less colorful66171 +Node: Make comments yellow and strings green70071 +Node: Make code syntax use the old alt-syntax style71974 +Node: Make use of alternative styles for code syntax75255 +Node: Make matching parenthesis more or less intense78919 +Node: Make box buttons more or less gray80355 +Node: Make TODO and DONE more or less intense81661 +Node: Make headings more or less colorful83364 +Node: Make Org agenda more or less colorful85764 +Node: Make inline code in prose use alternative styles89224 +Node: Make mail citations and headers more or less colorful91765 +Node: Make the region preserve text colors plus other styles94460 +Node: Make mouse highlights more or less colorful96271 +Node: Make language underlines less colorful97578 +Node: Make line numbers use alternative styles99024 +Node: Make diffs use only a foreground100961 +Node: Make deuteranopia diffs red and blue instead of yellow and blue103731 +Node: Make the themes look like what the maintainer uses106153 +Node: More accurate colors in terminal emulators110851 +Node: Range of color with terminal emulators112143 +Node: Preview theme colors114857 +Node: Per-theme customization settings116702 +Node: Get a single color from the palette118048 +Node: Use theme colors in code with modus-themes-with-colors120296 +Node: Do not extend the region background122629 +Node: Add padding to mode line123427 +Node: Remap face with local value125991 +Node: Font configurations for Org and others128414 +Ref: Font configurations for Org and others-Footnote-1131323 +Node: Configure bold and italic faces131510 +Node: Custom Org todo keyword and priority faces135667 +Node: Custom Org emphasis faces139386 +Node: Update Org block delimiter fontification144209 +Node: Measure color contrast146126 +Node: Load theme depending on time of day148824 +Node: Backdrop for pdf-tools149834 +Node: Toggle themes without reloading them152733 +Node: A theme-agnostic hook for theme loading154009 +Node: Use more spacious margins or padding in Emacs frames156462 +Node: Custom hl-todo colors160552 +Node: Add support for solaire-mode162090 +Node: Face coverage165001 +Node: Supported packages165453 +Node: Indirectly covered packages171159 +Node: Notes on individual packages172528 +Node: Note on calendarel weekday and weekend colors173628 +Node: Note on git-gutter in Doom Emacs174776 +Node: Note on php-mode multiline comments177117 +Node: Note on underlines in compilation buffers177870 +Node: Note on inline Latex in Org buffers178707 +Node: Note on dimmerel179317 +Node: Note on display-fill-column-indicator-mode180802 +Node: Note on highlight-parenthesesel182201 +Node: Note on mmm-modeel background colors188179 +Node: Note for prism190479 +Node: Note on company-mode overlay pop-up193647 +Ref: Note on company-mode overlay pop-up-Footnote-1194377 +Ref: Note on company-mode overlay pop-up-Footnote-2194444 +Node: Note on ERC escaped color sequences194499 +Ref: Note on ERC escaped color sequences-Footnote-1195927 +Node: Note on powerline or spaceline196037 +Node: Note on SHR colors196451 +Node: Note on SHR fonts196875 +Node: Note on Ement colors and fonts197520 +Node: Note on pdf-tools link hints199030 +Node: Note on the Notmuch logo201490 +Node: Note on goto-address-mode faces202028 +Node: Frequently Asked Questions203146 +Node: Is the contrast ratio about adjacent colors?203777 +Node: What does it mean to avoid exaggerations?205284 +Node: Why are colors mostly variants of blue magenta cyan?207134 +Node: What is the best setup for legibility?211440 +Node: Are these color schemes?214085 +Node: Port the Modus themes to other platforms?217767 +Node: Contributing220611 +Node: Sources of the themes221008 +Node: Issues you can help with221902 +Node: Patches require copyright assignment to the FSF223293 +Node: Acknowledgements225513 +Node: GNU Free Documentation License229649 +Node: Indices255013 +Node: Function index255192 +Node: Variable index256375 +Node: Concept index258831 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/elpa/modus-themes-4.3.0/doc/modus-themes.org b/elpa/modus-themes-4.3.0/doc/modus-themes.org @@ -0,0 +1,5906 @@ +#+title: Modus themes for GNU Emacs +#+author: Protesilaos Stavrou +#+email: info@protesilaos.com +#+language: en +#+options: ':t toc:nil author:t email:t num:t +#+startup: content +#+macro: stable-version 4.3.0 +#+macro: release-date 2023-09-19 +#+macro: development-version 4.4.0-dev +#+macro: file @@texinfo:@file{@@$1@@texinfo:}@@ +#+macro: space @@texinfo:@: @@ +#+macro: kbd @@texinfo:@kbd{@@$1@@texinfo:}@@ +#+texinfo_filename: modus-themes.info +#+texinfo_dir_category: Emacs misc features +#+texinfo_dir_title: Modus Themes: (modus-themes) +#+texinfo_dir_desc: Elegant, highly legible and customizable themes +#+texinfo_header: @set MAINTAINERSITE @uref{https://protesilaos.com,maintainer webpage} +#+texinfo_header: @set MAINTAINER Protesilaos Stavrou +#+texinfo_header: @set MAINTAINEREMAIL @email{info@protesilaos.com} +#+texinfo_header: @set MAINTAINERCONTACT @uref{mailto:info@protesilaos.com,contact the maintainer} + +#+texinfo: @insertcopying + +This manual, written by Protesilaos Stavrou, describes the +customization options for the Modus themes, and provides every other +piece of information pertinent to them. + +The documentation furnished herein corresponds to stable version +{{{stable-version}}}, released on {{{release-date}}}. Any reference +to a newer feature which does not yet form part of the latest tagged +commit, is explicitly marked as such. + +Current development target is {{{development-version}}}. + ++ Package name (GNU ELPA): ~modus-themes~ ++ Official manual: <https://protesilaos.com/emacs/modus-themes> ++ Change log: <https://protesilaos.com/emacs/modus-themes-changelog> ++ Color palette: <https://protesilaos.com/emacs/modus-themes-colors> ++ Sample pictures: <https://protesilaos.com/emacs/modus-themes-pictures> ++ Git repo on SourceHut: <https://git.sr.ht/~protesilaos/modus-themes> + - Mirrors: + + GitHub: <https://github.com/protesilaos/modus-themes> + + GitLab: <https://gitlab.com/protesilaos/modus-themes> ++ Mailing list: <https://lists.sr.ht/~protesilaos/modus-themes> ++ Backronym: My Old Display Unexpectedly Sharpened ... themes + +#+toc: headlines 8 insert TOC here, with eight headline levels + +* COPYING +:properties: +:copying: t +:custom_id: h:b14c3fcb-13dd-4144-9d92-2c58b3ed16d3 +:end: + +Copyright (C) 2020-2023 Free Software Foundation, Inc. + +#+begin_quote +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, with the Front-Cover Texts being “A GNU Manual,” and +with the Back-Cover Texts as in (a) below. A copy of the license is +included in the section entitled “GNU Free Documentation License.” + +(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and +modify this GNU manual.” +#+end_quote + +* Overview +:properties: +:custom_id: h:f0f3dbcb-602d-40cf-b918-8f929c441baf +:end: + +The Modus themes are designed for accessible readability. They +conform with the highest standard for color contrast between +combinations of background and foreground values. For small sized +text, this corresponds to the WCAG AAA standard, which specifies a +minimum rate of distance in relative luminance of 7:1. + +The Modus themes consist of eight themes, divided into four subgroups. + +- Main themes :: ~modus-operandi~ is the project's main light theme, + while ~modus-vivendi~ is its dark counterpart. These two themes are + part of the project since its inception. They are designed to cover + a broad range of needs and are, in the opinion of the author, the + reference for what a highly legible "default" theme should look + like. + +- Tinted themes :: ~modus-operandi-tinted~ and ~modus-vivendi-tinted~ + are variants of the two main themes. They slightly tone down the + intensity of the background and provide a bit more color variety. + ~modus-operandi-tinted~ has a set of base tones that are shades of + light ochre (earthly colors), while ~modus-vivendi-tinted~ gives a + night sky impression. + +- Deuteranopia themes :: ~modus-operandi-deuteranopia~ and its + companion ~modus-vivendi-deuteranopia~ are optimized for users with + red-green color deficiency. This means that they do not use red and + green hues for color-coding purposes, such as for diff removed and + added lines. Instead, they implement colors that are discernible by + users with deueteranopia or deuteranomaly (mostly yellow and blue + hues). + +- Tritanopia themes :: ~modus-operandi-tritanopia~ and its counterpart + ~modus-vivendi-tritanopia~ are optimized for users with blue-yellow + color deficiency. The idea is the same as with the deuteranopia + variants: color coding relies only on hues that are accessible to + people with tritanopia or tritanomaly, namely, shades of red and + cyan. + +To ensure that users have a consistently accessible experience, the +themes strive to achieve as close to full face coverage as possible, +while still targeting a curated list of well-maintained packages +([[#h:a9c8f29d-7f72-4b54-b74b-ddefe15d6a19][Face coverage]]). + +The overarching objective of this project is to always offer +accessible color combinations. There shall never be a compromise on +this principle. If there arises an inescapable trade-off between +usability and stylistic considerations, we will always opt for the +former. + +Starting with version 0.12.0 and onwards, the themes are built into GNU +Emacs. + +** How do the themes look like +:properties: +:custom_id: h:69b92089-069c-4ba1-9d94-cc3415fc4f87 +:end: +#+cindex: Screenshots + +Check the web page with [[https://protesilaos.com/emacs/modus-themes-pictures/][the screen shots]]. Note that the themes are +highly customizable ([[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization options]]). + +** Learn about the latest changes +:properties: +:custom_id: h:2cc37c36-6c1a-48b2-a010-1050b270ee18 +:end: +#+cindex: Changelog + +Please refer to the [[https://protesilaos.com/emacs/modus-themes-changelog][web page with the change log]]. It is comprehensive +and covers everything that goes into every tagged release of the themes. + +* Installation +:properties: +:custom_id: h:1af85373-7f81-4c35-af25-afcef490c111 +:end: + +The Modus themes are distributed with Emacs starting with version 28.1. +On older versions of Emacs, they can be installed using Emacs' package +manager or manually from their code repository. There also exist +packages for distributions of GNU/Linux. + +Emacs 28 ships with ~modus-themes~ version =1.6.0=. Emacs 29 includes +version =3.0.0=. Emacs 30 provides a newer, refactored version that +thoroughly refashions how the themes are implemented and customized. +Such major versions are not backward-compatible due to the limited +resources at the maintainer's disposal to support multiple versions of +Emacs and of the themes across the years. + +** Install manually from source +:properties: +:custom_id: h:da3414b7-1426-46b8-8e76-47b845b76fd0 +:end: + +In the following example, we are assuming that your Emacs files are +stored in {{{file(~/.emacs.d)}}} and that you want to place the Modus +themes in {{{file(~/.emacs.d/modus-themes)}}}. + +1. Get the source and store it in the desired path by running the + following in the command line shell: + +: $ git clone https://gitlab.com/protesilaos/modus-themes.git ~/.emacs.d/modus-themes + +2. Add that path to your known Elisp libraries' list, by placing this + snippet of Emacs Lisp in your init file (e.g. {{{file(init.el)}}}): + +#+begin_src emacs-lisp +(add-to-list 'load-path "~/.emacs.d/modus-themes") +#+end_src + +The themes are now ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]. + +** Install from the archives +:properties: +:custom_id: h:c4b10085-149f-43e2-bd4d-347f33aee054 +:end: + +The ~modus-themes~ package is available from the GNU ELPA archive, which +is configured by default. + +Prior to querying any package archive, make sure to update the index, +with {{{kbd(M-x package-refresh-contents)}}}. Then all you need to do +is type {{{kbd(M-x package-install)}}} and specify the ~modus-themes~. + +Once installed, the themes are ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]. + +** Install on GNU/Linux +:properties: +:custom_id: h:da640eb1-95dd-4e86-bb4e-1027b27885f0 +:end: + +The themes are also available from the archives of some distributions of +GNU/Linux. These should correspond to a tagged release rather than +building directly from the latest Git commit. It all depends on the +distro's packaging policies. + +*** Debian 11 Bullseye +:properties: +:custom_id: h:7e570360-9ee6-4bc5-8c04-9dc11418a3e4 +:end: + +The themes are part of Debian 11 Bullseye. Get them with: + +#+begin_src sh +sudo apt install elpa-modus-themes +#+end_src + +They are now ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]. + +NOTE that Debian's package is severely out-of-date as of this writing +2022-07-24 09:57 +0300. + +*** GNU Guix +:properties: +:custom_id: h:a4ca52cd-869f-46a5-9e16-4d9665f5b88e +:end: + +Users of Guix can get the themes with this command: + +#+begin_src sh +guix package -i emacs-modus-themes +#+end_src + +They are now ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]. + +** Dealing with byte compilation errors +:properties: +:custom_id: h:e6268471-e847-4c9d-998f-49a83257b7f1 +:end: + +From time to time, we receive bug reports pertaining to errors with +byte compilation. These seldom have to do with faulty code in the +themes: it might be a shortcoming of {{{file(package.el)}}}, some +regression in the current development target of Emacs, a +misconfiguration in an otherwise exotic setup, and the like. + +The common solution with a stable version of Emacs is to: + +1. Delete the ~modus-themes~ package. +2. Close the current Emacs session. +3. Install the ~modus-themes~ again. + +For those building Emacs directly from source, the solution may involve +reverting to an earlier commit in emacs.git. + +At any rate, if you encounter such an issue please report it: we will +either fix the bug on our end if it is truly ours, or help forward it to +the relevant upstream maintainer. Whatever you do, please understand +that a build failure does not mean we are necessarily doing something +wrong. + +[[#h:6536c8d5-3f98-43ab-a787-b94120e735e8][Issues you can help with]]. + +* Enable and load +:properties: +:custom_id: h:3f3c3728-1b34-437d-9d0c-b110f5b161a9 +:end: +#+findex: modus-themes-toggle +#+findex: modus-themes-load-theme +#+vindex: modus-themes-after-load-theme-hook +#+cindex: Essential configuration + +NOTE that Emacs can load multiple themes, which typically produces +undesirable results and undoes the work of the designer. Use the +~disable-theme~ command if you are trying other themes beside the +Modus collection ([[#h:adb0c49a-f1f9-4690-868b-013a080eed68][Option for disabling other themes while loading Modus]]). + +Users of the built-in themes cannot ~require~ the package as usual +because there is no package to speak of. Instead, things are simpler +as built-in themes are considered safe. All one needs is to load the +theme of their preference by adding either form to their init file: + +#+begin_src emacs-lisp +(load-theme 'modus-operandi) ; Light theme +(load-theme 'modus-vivendi) ; Dark theme +#+end_src + +Remember that the Modus themes are six themes ([[#h:f0f3dbcb-602d-40cf-b918-8f929c441baf][Overview]]). Adapt the +above snippet accordingly. + +Users of packaged variants of the themes must add a few more lines to +ensure that everything works as intended. First, one has to require the +main library before loading one of the themes: + +#+begin_src emacs-lisp +(require 'modus-themes) +#+end_src + +One can activate a theme with something like the following expression, +replacing ~modus-operandi~ with their preferred Modus theme: + +#+begin_src emacs-lisp +(load-theme 'modus-operandi :no-confirm) +#+end_src + +Changes to the available customization options must always be evaluated +before loading a theme ([[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization Options]]). Reload a theme for +new changes to take effect. + +This is how a basic setup could look like ([[#h:b66b128d-54a4-4265-b59f-4d1ea2feb073][The require-theme for built-in Emacs themes]]): + +#+begin_src emacs-lisp +;;; For the built-in themes which cannot use `require'. +(require-theme 'modus-themes) + +;; Add all your customizations prior to loading the themes. +(setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + +;; Load the theme of your choice. +(load-theme 'modus-operandi) + +;; Optionally define a key to switch between Modus themes. Also check +;; the user option `modus-themes-to-toggle'. +(define-key global-map (kbd "<f5>") #'modus-themes-toggle) + + + +;;; For packaged versions which must use `require'. + +(require 'modus-themes) + +;; Add all your customizations prior to loading the themes +(setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + +;; Load the theme of your choice. +(load-theme 'modus-operandi :no-confirm) + +(define-key global-map (kbd "<f5>") #'modus-themes-toggle) +#+end_src + +[[#h:e979734c-a9e1-4373-9365-0f2cd36107b8][Sample configuration with and without use-package]]. + +** The ~require-theme~ for built-in Emacs themes +:PROPERTIES: +:CUSTOM_ID: h:b66b128d-54a4-4265-b59f-4d1ea2feb073 +:END: + +The version of the Modus themes that is included in Emacs CANNOT use +the standard ~require~. This is because the built-in themes are not +included in the ~load-path~ (not my decision). The ~require-theme~ +function must be used in this case as a replacement. For example: + +#+begin_src emacs-lisp +(require-theme 'modus-themes) + +;; All customizations here +(setq modus-themes-bold-constructs t + modus-themes-italic-constructs t) + +;; Maybe define some palette overrides, such as by using our presets +(setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + +;; Load the theme of choice (built-in themes are always "safe" so they +;; do not need the `no-require' argument of `load-theme'). +(load-theme 'modus-operandi) + +(define-key global-map (kbd "<f5>") #'modus-themes-toggle) +#+end_src + +** Sample configuration with and without use-package +:properties: +:custom_id: h:e979734c-a9e1-4373-9365-0f2cd36107b8 +:end: +#+cindex: use-package configuration +#+cindex: sample configuration + +What follows is a variant of what we demonstrate in the previous +section ([[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]). + +It is common for Emacs users to rely on ~use-package~ for declaring +package configurations in their setup. We use this as an example: + +#+begin_src emacs-lisp +;;; For the built-in themes which cannot use `require'. +(use-package emacs + :config + (require-theme 'modus-themes) ; `require-theme' is ONLY for the built-in Modus themes + + ;; Add all your customizations prior to loading the themes + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Maybe define some palette overrides, such as by using our presets + (setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + + ;; Load the theme of your choice. + (load-theme 'modus-operandi) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle)) + + + +;;; For packaged versions which must use `require'. +(use-package modus-themes + :ensure t + :config + ;; Add all your customizations prior to loading the themes + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Maybe define some palette overrides, such as by using our presets + (setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + + ;; Load the theme of your choice. + (load-theme 'modus-operandi) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle)) +#+end_src + +The same without ~use-package~: + +#+begin_src emacs-lisp +(require 'modus-themes) ; OR for the built-in themes: (require-theme 'modus-themes) + +;; Add all your customizations prior to loading the themes +(setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + +;; Maybe define some palette overrides, such as by using our presets +(setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + +;; Load the theme of your choice: +(load-theme 'modus-operandi :no-confirm) + +(define-key global-map (kbd "<f5>") #'modus-themes-toggle) +#+end_src + +[[#h:e68560b3-7fb0-42bc-a151-e015948f8a35][Differences between loading and enabling]]. + +Note: make sure not to customize the variable ~custom-theme-load-path~ +or ~custom-theme-directory~ after the themes' package declaration. That +will lead to failures in loading the files. If either or both of those +variables need to be changed, their values should be defined before the +package declaration of the themes. + +[[#h:aabcada6-810d-4eee-b34a-d2a9c301824d][Make the themes look like what the maintainer uses]] + +** Differences between loading and enabling +:properties: +:custom_id: h:e68560b3-7fb0-42bc-a151-e015948f8a35 +:end: +#+cindex: load-theme VS enable-theme + +The reason we recommend ~load-theme~ instead of the other option of +~enable-theme~ is that the former does a kind of "reset" on the face +specs. It quite literally loads (or reloads) the theme. Whereas the +~enable-theme~ function simply puts an already loaded theme to the top +of the list of enabled items, re-using whatever state was last loaded. + +As such, ~load-theme~ reads all customizations that may happen during +any given Emacs session: even after the initial setup of a theme. +Examples are calls to ~custom-set-faces~, as well as new values assigned +to the options the Modus themes provide ([[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization Options]]). + +Our tests show that ~enable-theme~ does not read such variables anew, so +it might appear to the unsuspecting user that the themes are somehow +broken whenever they try to assign a new value to a customization option +or some face. + +This "reset" that ~load-theme~ brings about does, however, come at the +cost of being somewhat slower than ~enable-theme~. Users who have a +stable setup and who seldom update their variables during a given Emacs +session, are better off using something like this: + +#+begin_src emacs-lisp +(require 'modus-themes) + +;; Activate your desired themes here +(load-theme 'modus-operandi t t) +(load-theme 'modus-vivendi t t) + +;; Enable the preferred one +(enable-theme 'modus-operandi) +#+end_src + +[[#h:b40aca50-a3b2-4c43-be58-2c26fcd14237][Toggle themes without reloading them]]. + +[[#h:e979734c-a9e1-4373-9365-0f2cd36107b8][Sample configuration with and without use-package]]. + +With the above granted, other sections of the manual discuss how to +configure custom faces, where ~load-theme~ is expected, though +~enable-theme~ could still apply in stable setups: + +[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]]. + +* Customization options +:properties: +:custom_id: h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f +:end: + +The Modus themes are highly configurable, though they should work well +without any further tweaks. We provide a variety of user options. +The following code block provides an overview. In addition to those +variables, the themes support a comprehensive system of overrides: it +can be used to make thoroughgoing changes to the looks of the themes +([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). We document everything at length in +the pages of this manual and also provide ready-to-use code samples. + +Remember that all customization options must be evaluated before loading +a theme ([[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]). If the theme is already active, it must be +reloaded for changes to take effect. + +#+begin_src emacs-lisp +;; In all of the following, WEIGHT is a symbol such as `semibold', +;; `light', `bold', or anything mentioned in `modus-themes-weights'. +(setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil + modus-themes-mixed-fonts t + modus-themes-variable-pitch-ui nil + modus-themes-custom-auto-reload t + modus-themes-disable-other-themes t + + ;; Options for `modus-themes-prompts' are either nil (the + ;; default), or a list of properties that may include any of those + ;; symbols: `italic', `WEIGHT' + modus-themes-prompts '(italic bold) + + ;; The `modus-themes-completions' is an alist that reads two + ;; keys: `matches', `selection'. Each accepts a nil value (or + ;; empty list) or a list of properties that can include any of + ;; the following (for WEIGHT read further below): + ;; + ;; `matches' :: `underline', `italic', `WEIGHT' + ;; `selection' :: `underline', `italic', `WEIGHT' + modus-themes-completions + '((matches . (extrabold)) + (selection . (semibold italic text-also))) + + modus-themes-org-blocks 'gray-background ; {nil,'gray-background,'tinted-background} + + ;; The `modus-themes-headings' is an alist: read the manual's + ;; node about it or its doc string. Basically, it supports + ;; per-level configurations for the optional use of + ;; `variable-pitch' typography, a height value as a multiple of + ;; the base font size (e.g. 1.5), and a `WEIGHT'. + modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (1.3)) + (agenda-date . (1.3)) + (agenda-structure . (variable-pitch light 1.8)) + (t . (1.1)))) + +;; Remember that more (MUCH MORE) can be done with overrides, which we +;; document extensively in this manual. +#+end_src + +** Option for reloading the theme on custom change +:properties: +:alt_title: Custom reload theme +:description: Toggle auto-reload of the theme when setting custom variables +:custom_id: h:9001527a-4e2c-43e0-98e8-3ef72d770639 +:end: +#+vindex: modus-themes-custom-auto-reload + +Brief: Toggle reloading of the active theme when an option is changed +through the Custom UI. + +Symbol: ~modus-themes-custom-auto-reload~ (=boolean= type) + +Possible values: + +1. ~nil~ +2. ~t~ (default) + +All theme user options take effect when a theme is loaded. Any +subsequent changes require the theme to be reloaded. + +When this variable has a non-~nil~ value, any change made via the Custom +UI or related functions such as ~customize-set-variable~ and ~setopt~ +(Emacs 29), will trigger a reload automatically. + +With a ~nil~ value, changes to user options have no further consequences: +the user must manually reload the theme ([[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]). + +** Option for disabling other themes while loading Modus +:properties: +:alt_title: Disable other themes +:description: Determine whether loading a Modus themes disables all others +:custom_id: h:adb0c49a-f1f9-4690-868b-013a080eed68 +:end: +#+vindex: modus-themes-disable-other-themes + +Brief: Disable all other themes when loading a Modus theme. + +Symbol: ~modus-themes-disable-other-themes~ (=boolean= type) + +Possible values: + +1. ~nil~ +2. ~t~ (default) + +When the value is non-~nil~, the commands ~modus-themes-toggle~ and +~modus-themes-select~, as well as the ~modus-themes-load-theme~ +function, will disable all other themes while loading the specified +Modus theme. This is done to ensure that Emacs does not blend two or +more themes: such blends lead to awkward results that undermine the +work of the designer. + +When the value is ~nil~, the aforementioned commands and function will +only disable other themes within the Modus collection. + +This option is provided because Emacs themes are not necessarily +limited to colors/faces: they can consist of an arbitrary set of +customizations. Users who use such customization bundles must set +this variable to a ~nil~ value. + +** Option for more bold constructs +:properties: +:alt_title: Bold constructs +:description: Toggle bold constructs in code +:custom_id: h:b25714f6-0fbe-41f6-89b5-6912d304091e +:end: +#+vindex: modus-themes-bold-constructs + +Brief: Use bold for code syntax highlighting and related. + +Symbol: ~modus-themes-bold-constructs~ (=boolean= type) + +Possible values: + +1. ~nil~ (default) +2. ~t~ + +The default is to use a bold typographic weight only when it is +required. + +With a non-~nil~ value (~t~) display several syntactic constructs in +bold weight. This concerns keywords and other important aspects of +code syntax. It also affects certain mode line indicators and command +prompts. + +Advanced users may also want to configure the exact attributes of the +~bold~ face. + +[[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]]. + +** Option for more italic constructs +:properties: +:alt_title: Italic constructs +:description: Toggle italic font constructs in code +:custom_id: h:977c900d-0d6d-4dbb-82d9-c2aae69543d6 +:end: +#+vindex: modus-themes-italic-constructs + +Brief: Use italics for code syntax highlighting and related. + +Symbol: ~modus-themes-italic-constructs~ (=boolean= type) + +Possible values: + +1. ~nil~ (default) +2. ~t~ + +The default is to not use slanted text forms (italics) unless it is +absolutely necessary. + +With a non-~nil~ value (~t~) choose to render more faces in italics. This +typically affects documentation strings and code comments. + +Advanced users may also want to configure the exact attributes of the +~italic~ face. + +[[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]]. + +** Option for font mixing +:properties: +:alt_title: Mixed fonts +:description: Toggle mixing of font families +:custom_id: h:115e6c23-ee35-4a16-8cef-e2fcbb08e28b +:end: +#+vindex: modus-themes-mixed-fonts + +Brief: Toggle the use of monospaced fonts for spacing-sensitive +constructs (affects font families). + +Symbol: ~modus-themes-mixed-fonts~ (=boolean= type) + +Possible values: + +1. ~nil~ (default) +2. ~t~ + +When set to non-~nil~ (~t~), configure some spacing-sensitive faces like Org +tables and code blocks to always inherit from the ~fixed-pitch~ face. +This is to ensure that certain constructs like code blocks and tables +remain monospaced even when users opt for a mode that remaps typeface +families, such as the built-in {{{kbd(M-x variable-pitch-mode)}}}. Otherwise +the layout can appear broken, due to how spacing is done. + +For a consistent experience, user may need to specify the font family of +the ~fixed-pitch~ face. + +[[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and others]]. + +** Option for command prompt styles +:properties: +:alt_title: Command prompts +:description: Control the style of command prompts +:custom_id: h:db5a9a7c-2928-4a28-b0f0-6f2b9bd52ba1 +:end: +#+vindex: modus-themes-prompts + +Brief: Control the style of command prompts (e.g. minibuffer, shell, IRC +clients). + +Symbol: ~modus-themes-prompts~ (=choice= type, list of properties) + +Possible values are expressed as a list of properties (default is ~nil~ or +an empty list). The list can include any of the following symbols: + ++ ~italic~ ++ ~italic~ ++ A font weight, which must be supported by the underlying typeface: + - ~thin~ + - ~ultralight~ + - ~extralight~ + - ~light~ + - ~semilight~ + - ~regular~ + - ~medium~ + - ~semibold~ + - ~bold~ + - ~heavy~ + - ~extrabold~ + - ~ultrabold~ + +The default (a ~nil~ value or an empty list) means to only use a subtle +colored foreground color. + +The ~italic~ property adds a slant to the font's forms (italic or +oblique forms, depending on the typeface). + +The symbol of a font weight attribute such as ~light~, ~semibold~, et +cetera, adds the given weight to links. Valid symbols are defined in +the variable ~modus-themes-weights~. The absence of a weight means +that the one of the underlying text will be used. + +Combinations of any of those properties are expressed as a list, like in +these examples: + +#+begin_src emacs-lisp +(bold italic) +(italic semibold) +#+end_src + +The order in which the properties are set is not significant. + +In user configuration files the form may look like this: + +#+begin_src emacs-lisp +(setq modus-themes-prompts '(extrabold italic)) +#+end_src + +[[#h:bd75b43a-0bf1-45e7-b8b4-20944ca8b7f8][Make prompts more or less colorful]]. + +** Option for completion framework aesthetics +:properties: +:alt_title: Completion UIs +:description: Choose among several styles for completion UIs +:custom_id: h:f1c20c02-7b34-4c35-9c65-99170efb2882 +:end: +#+vindex: modus-themes-completions + +Brief: Set the overall style of completion framework interfaces. + +Symbol: ~modus-themes-completions~ (=alist= type properties) + +This affects Company, Corfu, Flx, Icomplete/Fido, Ido, Ivy, Orderless, +Vertico, and the standard =*Completions*= buffer. The value is an +alist of expressions, each of which takes the form of =(KEY . LIST-OF-PROPERTIES)=. +=KEY= is a symbol, while =PROPERTIES= is a list. Here is a sample, +followed by a description of the particularities: + +#+begin_src emacs-lisp +(setq modus-themes-completions + '((matches . (extrabold underline)) + (selection . (semibold italic)))) +#+end_src + +The ~matches~ key refers to the highlighted characters that correspond +to the user's input. When its properties are ~nil~ or an empty list, +matching characters in the user interface will have a bold weight and +a colored foreground. The list of properties may include any of the +following symbols regardless of the order they may appear in: + +- ~underline~ to draw a line below the characters; + +- ~italic~ to use a slanted font (italic or oblique forms); + +- The symbol of a font weight attribute such as ~light~, + ~semibold~, et cetera. Valid symbols are defined in the + variable ~modus-themes-weights~. The absence of a weight means + that bold will be used. + +The ~selection~ key applies to the current line or currently matched +candidate, depending on the specifics of the user interface. When its +properties are ~nil~ or an empty list, it has a subtle gray background, +a bold weight, and the base foreground value for the text. The list +of properties it accepts is as follows (order is not significant): + +- ~underline~ to draw a line below the characters; + +- ~italic~ to use a slanted font (italic or oblique forms); + +- The symbol of a font weight attribute such as ~light~, + ~semibold~, et cetera. Valid symbols are defined in the + variable ~modus-themes-weights~. The absence of a weight means + that bold will be used. + +Apart from specifying each key separately, a catch-all list is +accepted. This is only useful when the desired aesthetic is the same +across all keys that are not explicitly referenced. For example, +this: + +#+begin_src emacs-lisp +(setq modus-themes-completions + '((t . (extrabold underline)))) +#+end_src + +Is the same as: + +#+begin_src emacs-lisp +(setq modus-themes-completions + '((matches . (extrabold underline)) + (selection . (extrabold underline)))) +#+end_src + +[[#h:d959f789-0517-4636-8780-18123f936f91][Make completion matches more or less colorful]]. + +** Option for org-mode block styles +:properties: +:alt_title: Org mode blocks +:description: Choose among plain, gray, or tinted backgrounds +:custom_id: h:b7e328c0-3034-4db7-9cdf-d5ba12081ca2 +:end: +#+vindex: modus-themes-org-blocks + +Brief: Set the overall style of Org code blocks, quotes, and the like. + +Symbol: ~modus-themes-org-blocks~ (=choice= type) + +Possible values: + +1. ~nil~ (default) +2. ~gray-background~ +3. ~tinted-background~ + +Option ~nil~ (the default) means that the block has no background of +its own: it uses the one that applies to the rest of the buffer. +In this case, the delimiter lines have a gray color for their text, +making them look exactly like all other Org properties. + +Option ~gray-background~ applies a subtle gray background to the +block's contents. It also affects the begin and end lines of the +block as they get another shade of gray as their background, which +differentiates them from the contents of the block. All background +colors extend to the edge of the window, giving the area a +rectangular, "blocky" presentation. If the begin/end lines do not +extend in this way, check the value of the Org user option +~org-fontify-whole-block-delimiter-line~. + +Option ~tinted-background~ uses a colored background for the contents +of the block. The exact color value will depend on the programming +language and is controlled by the variable ~org-src-block-faces~ +(refer to the theme's source code for the current association list). +For this to take effect, the Org buffer needs to be restarted with +~org-mode-restart~. + +Code blocks use their major mode's fontification (syntax highlighting) +only when the variable ~org-src-fontify-natively~ is non-~nil~. While +quote/verse blocks require setting +~org-fontify-quote-and-verse-blocks~ to a non-~nil~ value. + +[[#h:f44cc6e3-b0f1-4a5e-8a90-9e48fa557b50][Update Org block delimiter fontification]]. + +** Option for the headings' overall style +:properties: +:alt_title: Heading styles +:description: Choose among several styles, also per heading level +:custom_id: h:271eff19-97aa-4090-9415-a6463c2f9ae1 +:end: +#+vindex: modus-themes-headings + +Brief: Heading styles with optional list of values per heading level. + +Symbol: ~modus-themes-headings~ (=alist= type, multiple properties) + +This is an alist that accepts a =(KEY . LIST-OF-VALUES)= combination. +The =KEY= is either a number, representing the heading's level (0 +through 8) or ~t~, which pertains to the fallback style. The named +keys =agenda-date= and =agenda-structure= apply to the Org agenda. + +Level 0 is a special heading: it is used for what counts as a document +title or equivalent, such as the =#+title= construct we find in Org +files. Levels 1-8 are regular headings. + +The =LIST-OF-VALUES= covers symbols that refer to properties, as +described below. Here is a complete sample with various stylistic +combinations, followed by a presentation of all available properties: + +#+begin_src emacs-lisp +(setq modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (1.3)) + (agenda-date . (1.3)) + (agenda-structure . (variable-pitch light 1.8)) + (t . (1.1)))) +#+end_src + +Properties: + ++ A font weight, which must be supported by the underlying typeface: + - ~thin~ + - ~ultralight~ + - ~extralight~ + - ~light~ + - ~semilight~ + - ~regular~ + - ~medium~ + - ~semibold~ + - ~bold~ (default) + - ~heavy~ + - ~extrabold~ + - ~ultrabold~ ++ A floating point as a height multiple of the default or a cons cell in + the form of =(height . FLOAT)=. + +By default (a ~nil~ value for this variable), all headings have a bold +typographic weight and use a desaturated text color. + +A ~variable-pitch~ property changes the font family of the heading to that +of the ~variable-pitch~ face (normally a proportionately spaced typeface). + +The symbol of a weight attribute adjusts the font of the heading +accordingly, such as ~light~, ~semibold~, etc. Valid symbols are +defined in the variable ~modus-themes-weights~. The absence of a weight +means that bold will be used by virtue of inheriting the ~bold~ face. + +[[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]]. + +A number, expressed as a floating point (e.g. 1.5), adjusts the height +of the heading to that many times the base font size. The default +height is the same as 1.0, though it need not be explicitly stated. +Instead of a floating point, an acceptable value can be in the form of a +cons cell like =(height . FLOAT)= or =(height FLOAT)=, where FLOAT is +the given number. + +Combinations of any of those properties are expressed as a list, like in +these examples: + +#+begin_src emacs-lisp +(semibold) +(variable-pitch semibold 1.3) +(variable-pitch semibold (height 1.3)) ; same as above +(variable-pitch semibold (height . 1.3)) ; same as above +#+end_src + +The order in which the properties are set is not significant. + +In user configuration files the form may look like this: + +#+begin_src emacs-lisp +(setq modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (1.3)) + (agenda-date . (1.3)) + (agenda-structure . (variable-pitch light 1.8)) + (t . (1.1)))) +#+end_src + +When defining the styles per heading level, it is possible to pass a +non-~nil~ value (~t~) instead of a list of properties. This will retain the +original aesthetic for that level. For example: + +#+begin_src emacs-lisp +(setq modus-themes-headings + '((1 . t) ; keep the default style + (2 . (semibold 1.2)) + (t . (rainbow)))) ; style for all other headings + +(setq modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (semibold)) + (t . t))) ; default style for all other levels +#+end_src + +Note that the text color of headings, of their background, and +overline can all be set via the overrides. It is possible to have any +color combination for any heading level (something that could not be +done in older versions of the themes). + +[[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]. + +[[#h:11297984-85ea-4678-abe9-a73aeab4676a][Make headings more or less colorful]]. + +** Option for variable-pitch font in UI elements +:properties: +:alt_title: UI typeface +:description: Toggle the use of variable-pitch across the User Interface +:custom_id: h:16cf666c-5e65-424c-a855-7ea8a4a1fcac +:end: +#+vindex: modus-themes-variable-pitch-ui + +Brief: Toggle the use of proportionately spaced (~variable-pitch~) fonts +in the User Interface. + +Symbol: ~modus-themes-variable-pitch-ui~ (=boolean= type) + +Possible values: + +1. ~nil~ (default) +2. ~t~ + +This option concerns User Interface elements that are under the direct +control of Emacs. In particular: the mode line, header line, tab bar, +and tab line. + +The default is to use the same font as the rest of Emacs, which usually +is a monospaced family. + +With a non-~nil~ value (~t~) apply a proportionately spaced typeface. This +is done by assigning the ~variable-pitch~ face to the relevant items. + +[[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and others]]. + +** Option for palette overrides +:properties: +:alt_title: Palette overrides +:description: Refashion color values and/or semantic color mappings +:custom_id: h:34c7a691-19bb-4037-8d2f-67a07edab150 +:end: + +This section describes palette overrides in detail. For a simpler +alternative, use the presets we provide ([[#h:b0bc811c-227e-42ec-bf67-15e1f41eb7bc][Palette override presets]]). + +Each Modus theme specifies a color palette that declares named color +values and semantic color mappings: + ++ Named colors consist of a symbol and a string that specifies a + hexadecimal RGB value. For example: =(blue-warmer "#354fcf")=. + ++ The semantic color mappings associate an abstract construct with a + given named color from the palette, like =(heading-2 yellow-faint)=. + Both elements of the list are symbols, though the ~cadr~ (value) can + be a string that specifies a color, such as =(heading-2 "#354fcf")=. + +#+vindex: modus-themes-common-palette-overrides +Both of those subsets can be overridden, thus refashioning the theme. +Overrides are either shared, by being stored in the user option +~modus-themes-common-palette-overrides~, or they are specific to the +theme they name. In the latter case, the naming scheme of each +palette variable is =THEME-NAME-palette-overrides=, thus yielding: + +#+vindex: modus-operandi-palette-overrides ++ ~modus-operandi-palette-overrides~ + +#+vindex: modus-operandi-deuteranopia-palette-overrides ++ ~modus-operandi-deuteranopia-palette-overrides~ + +#+vindex: modus-operandi-tinted-palette-overrides ++ ~modus-operandi-tinted-palette-overrides~ + +#+vindex: modus-operandi-tritanopia-palette-overrides ++ ~modus-operandi-tritanopia-palette-overrides~ + +#+vindex: modus-vivendi-palette-overrides ++ ~modus-vivendi-palette-overrides~ + +#+vindex: modus-vivendi-deuteranopia-palette-overrides ++ ~modus-vivendi-deuteranopia-palette-overrides~ + +#+vindex: modus-vivendi-tinted-palette-overrides ++ ~modus-vivendi-tinted-palette-overrides~ + +#+vindex: modus-vivendi-tritanopia-palette-overrides ++ ~modus-vivendi-tritanopia-palette-overrides~ + +Theme-specific overrides take precedence over the shared ones. It is +strongly advised that shared overrides do NOT alter color values, as +those will not be appropriate for both dark and light themes. Common +overrides are best limited to the semantic color mappings as those use +the color value that corresponds to the active theme (e.g. make the +cursor =blue-warmer= in all themes, whatever the value of +=blue-warmer= is in each theme). + +The value of any overrides' variable must mirror a theme's palette. +Palette variables are named after their theme as =THEME-NAME-palette=. +For example, the ~modus-operandi-palette~ is like this: + +#+begin_src emacs-lisp +(defconst modus-operandi-palette + '( +;;; Basic values + + (bg-main "#ffffff") + (bg-dim "#f0f0f0") + (fg-main "#000000") + + ;; ... + + (red "#a60000") + (red-warmer "#972500") + (red-cooler "#a0132f") + (red-faint "#7f0000") + (red-intense "#d00000") + + ;; ... + +;;;; Mappings + + ;; ... + + (cursor fg-main) + (builtin magenta-warmer) + (comment fg-dim) + (constant blue-cooler) + (docstring green-faint) + (fnname magenta) + (keyword magenta-cooler) + + ;; ... + )) +#+end_src + +The ~modus-operandi-palette-overrides~ targets the entries that need +to be changed. For example, to make the main foreground color a dark +gray instead of pure black, use a shade of red for comments, and apply +a cyan hue to keywords: + +#+begin_src emacs-lisp +(setq modus-operandi-palette-overrides + '((fg-main "#333333") + (comment red-faint) + (keyword cyan-cooler))) +#+end_src + +Changes take effect upon theme reload ([[#h:9001527a-4e2c-43e0-98e8-3ef72d770639][Custom reload theme]]). +Overrides are removed by setting their variable to a ~nil~ value. + +The common accented foregrounds in each palette follow a predictable +naming scheme: =HUE{,-warmer,-cooler,-faint,-intense}=. =HUE= is one +of the six basic colors: red, green, blue, yellow, magenta, cyan. + +Named colors that are meant to be used as backgrounds contain =bg= in +their name, such as =bg-red-intense=. While special purpose +foregrounds that are meant to be combined with such backgrounds, +contain =fg= in their name, such as =fg-removed= which complements +=bg-removed=. + +Named colors can be previewed, such as with the command +~modus-themes-list-colors~ ([[#h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d][Preview theme colors]]). + +For a video tutorial that users of all skill levels can approach, +watch: https://protesilaos.com/codelog/2022-12-17-modus-themes-v4-demo/. + +* Advanced customization +:properties: +:custom_id: h:f4651d55-8c07-46aa-b52b-bed1e53463bb +:end: + +Unlike the predefined customization options which follow a clear pattern +of allowing the user to quickly specify their preference, the themes +also provide a more flexible, albeit difficult, mechanism to control +things with precision ([[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization Options]]). + +This section is of interest only to users who are prepared to maintain +their own local tweaks and who are willing to deal with any possible +incompatibilities between versioned releases of the themes. As such, +they are labeled as "do-it-yourself" or "DIY". + +** Palette override presets +:PROPERTIES: +:CUSTOM_ID: h:b0bc811c-227e-42ec-bf67-15e1f41eb7bc +:END: + +This section shows how to refashion the themes by opting in to the +stylistic presets we provide. Those presets override the default +color mappings to amplify, tone down, or refashion the overall +coloration of the themes. + +To make almost all aspects of the themes less intense, use this: + +#+begin_src emacs-lisp +;; Always remember to reload the theme for changes to take effect! +(setq modus-themes-common-palette-overrides modus-themes-preset-overrides-faint) +#+end_src + +#+vindex: modus-themes-preset-overrides-faint +With ~modus-themes-preset-overrides-faint~ the grays are toned down, +gray backgrounds are removed from some contexts, and almost all accent +colors are desaturated. It makes the themes less attention-grabbing. + +On the opposite end of the stylistic spectrum, we have this + +#+begin_src emacs-lisp +;; Always remember to reload the theme for changes to take effect! +(setq modus-themes-common-palette-overrides modus-themes-preset-overrides-intense) +#+end_src + +#+vindex: modus-themes-preset-overrides-intense +The ~modus-themes-preset-overrides-intense~ makes many background +colors accented instead of gray and increases coloration in a number +of places. Colors stand out more and are made easier to spot. + +#+vindex: modus-themes-preset-overrides-cooler +#+vindex: modus-themes-preset-overrides-warmer +For some stylistic variation try the "cooler" and "warmer" presets: + +#+begin_src emacs-lisp +;; This: +(setq modus-themes-common-palette-overrides modus-themes-preset-overrides-cooler) + +;; Or: +(setq modus-themes-common-palette-overrides modus-themes-preset-overrides-warmer) +#+end_src + +Note that the user is not limited to those presets. The system of +overrides we provide makes it possible to tweak the value of each +individual named color and to change how values are assigned to +semantic color mappings ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). Subsequent +sections provide examples ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). + +It is also possible to use those presets as a basis and, for example, +add to them code from the subsequent sections of this manual. This is +the general idea (extra space for didactic purposes): + +#+begin_src emacs-lisp +(setq modus-themes-common-palette-overrides + `( + ;; From the section "Make the mode line borderless" + (border-mode-line-active unspecified) + (border-mode-line-inactive unspecified) + + ;; From the section "Make matching parenthesis more or less intense" + (bg-paren-match bg-magenta-intense) + (underline-paren-match fg-main) + + ;; And expand the preset here. Note that the ,@ works because + ;; we use the backtick for this list, instead of a straight + ;; quote. + ,@modus-themes-preset-overrides-intense)) +#+end_src + +** Stylistic variants using palette overrides +:PROPERTIES: +:CUSTOM_ID: h:df1199d8-eaba-47db-805d-6b568a577bf3 +:END: + +This section contains practical examples of overriding the palette of +the themes ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). Users can copy the code to +their init file, evaluate it, and then re-load the theme for changes +to take effect. To apply overrides at startup simply define them +before the call that loads the theme. Remember that we also provide +presets that are easier to apply ([[#h:b0bc811c-227e-42ec-bf67-15e1f41eb7bc][Palette override presets]]). + +*** Make the mode line borderless +:PROPERTIES: +:CUSTOM_ID: h:80ddba52-e188-411f-8cc0-480ebd75befe +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). To +hide the border around the active and inactive mode lines, we need to +set their color to that of the underlying background. + +[[#h:e8d781be-eefc-4a81-ac4e-5ed156190df7][Make the active mode line colorful]]. + +[[#h:5a0c58cc-f97f-429c-be08-927b9fbb0a9c][Add padding to mode line]]. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + +;; Remove the border +(setq modus-themes-common-palette-overrides + '((border-mode-line-active unspecified) + (border-mode-line-inactive unspecified))) + +;; Keep the border but make it the same color as the background of the +;; mode line (thus appearing borderless). The difference with the +;; above is that this version is a bit thicker because the border are +;; still there. +(setq modus-themes-common-palette-overrides + '((border-mode-line-active bg-mode-line-active) + (border-mode-line-inactive bg-mode-line-inactive))) +#+end_src + +*** Make the active mode line colorful +:PROPERTIES: +:CUSTOM_ID: h:e8d781be-eefc-4a81-ac4e-5ed156190df7 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). +Here we show some snippets that apply different stylistic variants. +Of course, it is possible to use theme-specific overrides to, say, +have a blue mode line for ~modus-operandi~ and a red one for +~modus-vivendi~. + +[[#h:80ddba52-e188-411f-8cc0-480ebd75befe][Make the mode line borderless]]. + +[[#h:5a0c58cc-f97f-429c-be08-927b9fbb0a9c][Add padding to mode line]]. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + +;; Blue background, neutral foreground, intense blue border +(setq modus-themes-common-palette-overrides + '((bg-mode-line-active bg-blue-intense) + (fg-mode-line-active fg-main) + (border-mode-line-active blue-intense))) + +;; Subtle blue background, neutral foreground, intense blue border +(setq modus-themes-common-palette-overrides + '((bg-mode-line-active bg-blue-subtle) + (fg-mode-line-active fg-main) + (border-mode-line-active blue-intense))) + +;; Subtle red background, red foreground, invisible border +(setq modus-themes-common-palette-overrides + '((bg-mode-line-active bg-red-subtle) + (fg-mode-line-active red-warmer) + (border-mode-line-active bg-red-subtle))) +#+end_src + +*** Make the tab bar more or less colorful +:PROPERTIES: +:CUSTOM_ID: h:096658d7-a0bd-4a99-b6dc-9b20a20cda37 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). +Here we show how to affect the colors of the built-in ~tab-bar-mode~ +and ~tab-line-mode~. + +For consistent theme-wide results, consider changing the mode line, +fringes, and line numbers. These are shown in other sections of this +manual. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + + +;; Make the `tab-bar-mode' mode subtle while keepings its original +;; gray aesthetic. +(setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-main) + (bg-tab-current bg-active) + (bg-tab-other bg-dim))) + +;; Like the above, but the current tab has a colorful background and +;; the inactive tabs have a slightly more noticeable gray background. +(setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-main) + (bg-tab-current bg-cyan-intense) + (bg-tab-other bg-inactive))) + +;; Make the tabs colorful, using a monochromatic pattern (e.g. shades +;; of cyan). +(setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-cyan-nuanced) + (bg-tab-current bg-cyan-intense) + (bg-tab-other bg-cyan-subtle))) + +;; Like the above, but with a dichromatic pattern (cyan and magenta). +(setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-cyan-nuanced) + (bg-tab-current bg-magenta-intense) + (bg-tab-other bg-cyan-subtle))) +#+end_src + +*** Make the fringe invisible or another color +:PROPERTIES: +:CUSTOM_ID: h:c312dcac-36b6-4a1f-b1f5-ab1c9abe27b0 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). +Here we show how to make the fringe invisible or how to assign to it a +different color. The "fringe" is a small area to the right and left +side of the Emacs window which shows indicators such as for truncation +or continuation lines. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + +;; Make the fringe invisible +(setq modus-themes-common-palette-overrides + '((fringe unspecified))) + +;; Make the fringe more intense +(setq modus-themes-common-palette-overrides + '((fringe bg-active))) + +;; Make the fringe colorful, but nuanced +(setq modus-themes-common-palette-overrides + '((fringe bg-blue-nuanced))) +#+end_src + +*** Make links use subtle or no underlines +:PROPERTIES: +:CUSTOM_ID: h:6c1d1dea-5cbf-4d92-b7bb-570a7a23ffe9 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In +this example, we showcase the special use of the ~unspecified~ symbol +that underline mappings can read correctly. + +#+begin_src emacs-lisp +;; Subtle underlines +(setq modus-themes-common-palette-overrides + '((underline-link border) + (underline-link-visited border) + (underline-link-symbolic border))) + +;; No underlines +(setq modus-themes-common-palette-overrides + '((underline-link unspecified) + (underline-link-visited unspecified) + (underline-link-symbolic unspecified))) +#+end_src + +*** Make prompts more or less colorful +:PROPERTIES: +:CUSTOM_ID: h:bd75b43a-0bf1-45e7-b8b4-20944ca8b7f8 +:END: + +This section contains practical examples of overriding the palette of +the themes ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). In the following code +block we show how to add or remove color from prompts. + +[[#h:db5a9a7c-2928-4a28-b0f0-6f2b9bd52ba1][Option for command prompt styles]]. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + +;; Keep the background unspecified (like the default), but use a faint +;; foreground color. +(setq modus-themes-common-palette-overrides + '((fg-prompt cyan-faint) + (bg-prompt unspecified))) + +;; Add a nuanced background to prompts that complements their foreground. +(setq modus-themes-common-palette-overrides + '((fg-prompt cyan) + (bg-prompt bg-cyan-nuanced))) + +;; Add a yellow background and adjust the foreground accordingly. +(setq modus-themes-common-palette-overrides + '((fg-prompt fg-main) + (bg-prompt bg-yellow-subtle))) ; try to replace "subtle" with "intense" +#+end_src + +*** Make completion matches more or less colorful +:PROPERTIES: +:CUSTOM_ID: h:d959f789-0517-4636-8780-18123f936f91 +:END: + +This section contains practical examples of overriding the palette of +the themes ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). Here we demonstrate how +to activate background coloration for completion matches. We show +three different degrees of intensity. + +[[#h:f1c20c02-7b34-4c35-9c65-99170efb2882][Option for completion framework aesthetics]]. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + +;; Add a nuanced background color to completion matches, while keeping +;; their foreground intact (foregrounds do not need to be specified in +;; this case, but we do it for didactic purposes). +(setq modus-themes-common-palette-overrides + '((fg-completion-match-0 blue) + (fg-completion-match-1 magenta-warmer) + (fg-completion-match-2 cyan) + (fg-completion-match-3 red) + (bg-completion-match-0 bg-blue-nuanced) + (bg-completion-match-1 bg-magenta-nuanced) + (bg-completion-match-2 bg-cyan-nuanced) + (bg-completion-match-3 bg-red-nuanced))) + +;; Add intense background colors to completion matches and adjust the +;; foregrounds accordingly. +(setq modus-themes-common-palette-overrides + '((fg-completion-match-0 fg-main) + (fg-completion-match-1 fg-main) + (fg-completion-match-2 fg-main) + (fg-completion-match-3 fg-main) + (bg-completion-match-0 bg-blue-intense) + (bg-completion-match-1 bg-yellow-intense) + (bg-completion-match-2 bg-cyan-intense) + (bg-completion-match-3 bg-red-intense))) + +;; Like the above, but with subtle backgrounds. +(setq modus-themes-common-palette-overrides + '((fg-completion-match-0 fg-main) + (fg-completion-match-1 fg-main) + (fg-completion-match-2 fg-main) + (fg-completion-match-3 fg-main) + (bg-completion-match-0 bg-blue-subtle) + (bg-completion-match-1 bg-yellow-subtle) + (bg-completion-match-2 bg-cyan-subtle) + (bg-completion-match-3 bg-red-subtle))) +#+end_src + +Adding to the above, it is possible to, say, reduce the number of +colors to two: + +#+begin_src emacs-lisp +;; No backgrounds (like the default) and just use two colors. +(setq modus-themes-common-palette-overrides + '((fg-completion-match-0 blue) + (fg-completion-match-1 yellow) + (fg-completion-match-2 blue) + (fg-completion-match-3 yellow) + (bg-completion-match-0 unspecified) + (bg-completion-match-1 unspecified) + (bg-completion-match-2 unspecified) + (bg-completion-match-3 unspecified))) + +;; Again, a two-color style but this time with backgrounds +(setq modus-themes-common-palette-overrides + '((fg-completion-match-0 blue) + (fg-completion-match-1 yellow) + (fg-completion-match-2 blue) + (fg-completion-match-3 yellow) + (bg-completion-match-0 bg-blue-nuanced) + (bg-completion-match-1 bg-yellow-nuanced) + (bg-completion-match-2 bg-blue-nuanced) + (bg-completion-match-3 bg-yellow-nuanced))) +#+end_src + +The user can mix and match to their liking. + +*** Make comments yellow and strings green +:PROPERTIES: +:CUSTOM_ID: h:26f53daa-0065-48dc-88ab-6a718d16cd95 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In +previous versions of the themes, we provided an option for yellow-ish +comments and green-ish strings. For some users, those were still not +good enough, as the exact values were hardcoded. Here we show how to +reproduce the effect, but also how to tweak it to one's liking. + +[[#h:c8767172-bf11-4c96-81dc-e736c464fc9c][Make code syntax use the old alt-syntax style]]. + +[[#h:943063da-7b27-4ba4-9afe-f8fe77652fd1][Make use of alternative styles for code syntax]]. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + +;; Yellow comments and green strings like older versions of the Modus +;; themes +(setq modus-themes-common-palette-overrides + '((comment yellow-cooler) + (string green-cooler))) + +;; Faint yellow comments and a different shade of green for strings +(setq modus-themes-common-palette-overrides + '((comment yellow-faint) + (string green-warmer))) + +;; Green comments and yellow strings, because now the user has the +;; freedom to do it +(setq modus-themes-common-palette-overrides + '((comment green) + (string yellow-cooler))) +#+end_src + +*** Make code syntax use the old alt-syntax style +:PROPERTIES: +:CUSTOM_ID: h:c8767172-bf11-4c96-81dc-e736c464fc9c +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In +this section we show how to reproduce what previous versions of the +Modus themes provided as a stylistic alternative for code syntax. The +upside of using overrides for this purpose is that we can tweak the +style to our liking, but first let's start with its recreation: + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + + +;; The old "alt-syntax" +(setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment fg-dim) + (constant magenta-cooler) + (docstring magenta-faint) + (docmarkup green-faint) + (fnname magenta-warmer) + (keyword cyan) + (preprocessor cyan-cooler) + (string red-cooler) + (type magenta-cooler) + (variable blue-warmer) + (rx-construct magenta-warmer) + (rx-backslash blue-cooler))) +#+end_src + +The "alt-syntax" could optionally use green strings and yellow +comments ([[#h:26f53daa-0065-48dc-88ab-6a718d16cd95][Make comments yellow and strings green]]): + +#+begin_src emacs-lisp +;; Same as above, but with yellow comments and green strings +(setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment yellow-faint) + (constant magenta-cooler) + (docstring green-faint) + (docmarkup magenta-faint) + (fnname magenta-warmer) + (keyword cyan) + (preprocessor cyan-cooler) + (string green-cooler) + (type magenta-cooler) + (variable blue-warmer) + (rx-construct magenta-warmer) + (rx-backslash blue-cooler))) +#+end_src + +The standard "alt-syntax" has red strings. As such, it is interesting +to experiment with faintly red colored comments: + +#+begin_src emacs-lisp +;; Like the old "alt-syntax" but with faint red comments +(setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment red-faint) + (constant magenta-cooler) + (docstring magenta-faint) + (docmarkup green-faint) + (fnname magenta-warmer) + (keyword cyan) + (preprocessor cyan-cooler) + (string red-cooler) + (type magenta-cooler) + (variable blue-warmer) + (rx-construct magenta-warmer) + (rx-backslash blue-cooler))) +#+end_src + +The user can always mix and match styles to their liking. + +[[#h:943063da-7b27-4ba4-9afe-f8fe77652fd1][Make use of alternative styles for code syntax]]. + +*** Make use of alternative styles for code syntax +:PROPERTIES: +:CUSTOM_ID: h:943063da-7b27-4ba4-9afe-f8fe77652fd1 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). The +idea here is to change how named colors are mapped to code syntax. +Each of the following snippets give the ~modus-themes~ a different +feel while editing code. + +Note that my ~modus-themes~ and ~ef-themes~ do not use the same +palettes, so some things are different. If you copy from the latter +to the former, double-check that the entries exist in the given Modus +theme palette. + +[[#h:26f53daa-0065-48dc-88ab-6a718d16cd95][Make comments yellow and strings green]]. + +[[*Make code syntax use the old alt-syntax style][Make code syntax use the old alt-syntax style]]. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + + +;; Mimic `ef-night' theme (from my `ef-themes') for code syntax +;; highlighting, while still using the Modus colors (and other +;; mappings). +(setq modus-themes-common-palette-overrides + '((builtin green-cooler) + (comment yellow-faint) + (constant magenta-cooler) + (fnname cyan-cooler) + (keyword blue-warmer) + (preprocessor red-warmer) + (docstring cyan-faint) + (string blue-cooler) + (type magenta-cooler) + (variable cyan))) + +;; Mimic `ef-summer' theme (from my `ef-themes') for code syntax +;; highlighting, while still using the Modus colors (and other +;; mappings). +(setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment yellow-faint) + (constant red-cooler) + (fnname magenta-warmer) + (keyword magenta-cooler) + (preprocessor green-warmer) + (docstring cyan-faint) + (string yellow-warmer) + (type cyan-warmer) + (variable blue-warmer))) + +;; Mimic `ef-bio' theme (from my `ef-themes') for code syntax +;; highlighting, while still using the Modus colors (and other +;; mappings). +(setq modus-themes-common-palette-overrides + '((builtin green) + (comment yellow-faint) + (constant blue) + (fnname green-warmer) + (keyword green-cooler) + (preprocessor green) + (docstring green-faint) + (string magenta-cooler) + (type cyan-warmer) + (variable blue-warmer))) + +;; Mimic `ef-trio-light' theme (from my `ef-themes') for code syntax +;; highlighting, while still using the Modus colors (and other +;; mappings). +(setq modus-themes-common-palette-overrides + '((builtin magenta-cooler) + (comment yellow-faint) + (constant magenta-warmer) + (fnname blue-warmer) + (keyword magenta) + (preprocessor red-cooler) + (docstring magenta-faint) + (string green-cooler) + (type cyan-cooler) + (variable cyan-warmer))) +#+end_src + +*** Make matching parenthesis more or less intense +:PROPERTIES: +:CUSTOM_ID: h:259cf8f5-48ec-4b13-8a69-5d6387094468 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In +this code block we show how to change the background of matching +delimiters when ~show-paren-mode~ is enabled. We also demonstrate how +to enable underlines for those highlights. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + +;; Change the background to a shade of magenta +(setq modus-themes-common-palette-overrides + '((bg-paren-match bg-magenta-intense))) + +;; Enable underlines by applying a color to them +(setq modus-themes-common-palette-overrides + '((bg-paren-match bg-magenta-intense) + (underline-paren-match fg-main))) +#+end_src + +*** Make box buttons more or less gray +:PROPERTIES: +:CUSTOM_ID: h:4f6b6ca3-f5bb-4830-8312-baa232305360 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). By +default, the boxed buttons that appear in {{{kbd(M-x customize)}}} and +related are distinct shades of gray. The following set of overrides +removes the gray from the active buttons and amplifies it for the +inactive ones. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + +(setq modus-themes-common-palette-overrides + '((bg-button-active bg-main) + (fg-button-active fg-main) + (bg-button-inactive bg-inactive) + (fg-button-inactive "gray50"))) +#+end_src + +*** Make TODO and DONE more or less intense +:PROPERTIES: +:CUSTOM_ID: h:b57bb50b-a863-4ea8-bb38-6de2275fa868 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). +Here we show how to affect just the =TODO= and =DONE= keywords that we +encounter in Org buffers. The idea is to make those pop out more or +to subdue them. + +[[#h:11297984-85ea-4678-abe9-a73aeab4676a][Make headings more or less colorful]]. + +[[#h:bb5b396f-5532-4d52-ab13-149ca24854f1][Make inline code in prose use alternative styles]]. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + +;; Increase intensity +(setq modus-themes-common-palette-overrides + '((prose-done green-intense) + (prose-todo red-intense))) + +;; Tone down intensity +(setq modus-themes-common-palette-overrides + '((prose-done green-faint) ; OR replace `green-faint' with `olive' + (prose-todo red-faint))) ; OR replace `red-faint' with `rust' + +;; Keep TODO at its default (so no override for it), but make DONE +;; gray. +(setq modus-themes-common-palette-overrides + '((prose-done fg-dim))) +#+end_src + +*** Make headings more or less colorful +:PROPERTIES: +:CUSTOM_ID: h:11297984-85ea-4678-abe9-a73aeab4676a +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). +Here we show how to alter the looks of headings, such as in Org mode. +Using overrides here offers far more flexibility than what we could +achieve with previous versions of the themes: the user can mix and +match styles at will. + +[[#h:b57bb50b-a863-4ea8-bb38-6de2275fa868][Make TODO and DONE more intense]]. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + + +;; Apply more colorful foreground to some headings (headings 0-8). +;; Level 0 is for Org #+title and related. +(setq modus-themes-common-palette-overrides + '((fg-heading-1 blue-warmer) + (fg-heading-2 yellow-cooler) + (fg-heading-3 cyan-cooler))) + +;; Like the above, but with gradient colors +(setq modus-themes-common-palette-overrides + '((fg-heading-1 blue) + (fg-heading-2 cyan) + (fg-heading-3 green))) + +;; Add color to level 1 heading, but use the main foreground for +;; others +(setq modus-themes-common-palette-overrides + '((fg-heading-1 blue) + (fg-heading-2 fg-main) + (fg-heading-3 fg-main))) + +;; Apply colorful foreground, background, and overline (headings 0-8) +(setq modus-themes-common-palette-overrides + '((fg-heading-1 blue-warmer) + (bg-heading-1 bg-blue-nuanced) + (overline-heading-1 blue))) + +;; Apply gray scale foreground, background, and overline (headings 0-8) +(setq modus-themes-common-palette-overrides + '((fg-heading-1 fg-main) + (bg-heading-1 bg-dim) + (overline-heading-1 border))) +#+end_src + +*** Make Org agenda more or less colorful +:PROPERTIES: +:CUSTOM_ID: h:a5af0452-a50f-481d-bf60-d8143f98105f +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). +Here we provide three distinct code blocks. The first adds +alternative and more varied colors to the Org agenda (and related). +The second uses faint coloration. The third makes the agenda use +various shades of blue. Mix and match at will, while also combining +these styles with what we show in the other chapters with practical +stylistic variants. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + +;; Make the Org agenda use alternative and varied colors. +(setq modus-themes-common-palette-overrides + '((date-common cyan) ; default value (for timestamps and more) + (date-deadline red-warmer) + (date-event magenta-warmer) + (date-holiday blue) ; for M-x calendar + (date-now yellow-warmer) + (date-scheduled magenta-cooler) + (date-weekday cyan-cooler) + (date-weekend blue-faint))) +#+end_src + +An example with faint coloration: + +#+begin_src emacs-lisp +;; Make the Org agenda use faint colors. +(setq modus-themes-common-palette-overrides + '((date-common cyan-faint) ; for timestamps and more + (date-deadline red-faint) + (date-event fg-alt) ; default + (date-holiday magenta) ; default (for M-x calendar) + (date-now fg-main) ; default + (date-scheduled yellow-faint) + (date-weekday fg-dim) + (date-weekend fg-dim))) +#+end_src + +A third example that makes the agenda more blue: + +#+begin_src emacs-lisp +;; Make the Org agenda use more blue instead of yellow and red. +(setq modus-themes-common-palette-overrides + '((date-common cyan) ; default value (for timestamps and more) + (date-deadline blue-cooler) + (date-event blue-faint) + (date-holiday blue) ; for M-x calendar + (date-now blue-faint) + (date-scheduled blue) + (date-weekday fg-main) + (date-weekend fg-dim))) +#+end_src + +Yet another example that also affects =DONE= and =TODO= keywords: + +#+begin_src emacs-lisp +;; Change dates to a set of more subtle combinations. Deadlines are a +;; shade of magenta, scheduled dates are a shade of green that +;; complements that of the deadlines, weekday headings use the main +;; foreground color while weekends are a shade of gray. The DONE +;; keyword is a faint blue-gray while TODO is yellow. +(setq modus-themes-common-palette-overrides + '((date-deadline magenta-warmer) + (date-scheduled green-cooler) + (date-weekday fg-main) + (date-event fg-dim) + (date-now blue) + (prose-done fg-alt) + (prose-todo yellow))) +#+end_src + +*** Make inline code in prose use alternative styles +:PROPERTIES: +:CUSTOM_ID: h:bb5b396f-5532-4d52-ab13-149ca24854f1 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In +the following code block we show how to affect constructs such as +Org's verbatim, code, and macro entries. We also provide mappings for +tables, property drawers, tags, and code block delimiters, though we +do not show every possible permutation. + +[[#h:b57bb50b-a863-4ea8-bb38-6de2275fa868][Make TODO and DONE more or less intense]]. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + + +;; These are all the mappings at their default values for didactic +;; purposes +(setq modus-themes-common-palette-overrides + '((prose-block fg-dim) + (prose-code green-cooler) + (prose-done green) + (prose-macro magenta-cooler) + (prose-metadata fg-dim) + (prose-metadata-value fg-alt) + (prose-table fg-alt) + (prose-tag magenta-faint) + (prose-todo red) + (prose-verbatim magenta-warmer))) + +;; Make code block delimiters use a shade of red, tone down verbatim, +;; code, and macro, and amplify the style of property drawers +(setq modus-themes-common-palette-overrides + '((prose-block red-faint) + (prose-code fg-dim) + (prose-macro magenta-faint) + (prose-metadata cyan) + (prose-metadata-value green-warmer) + (prose-verbatim fg-dim))) + +;; Like the above but with more color variety for the inline code +;; elements +(setq modus-themes-common-palette-overrides + '((prose-block red-faint) + (prose-code blue-cooler) + (prose-macro yellow-warmer) + (prose-metadata cyan) + (prose-metadata-value green-warmer) + (prose-verbatim red-warmer))) +#+end_src + +*** Make mail citations and headers more or less colorful +:PROPERTIES: +:CUSTOM_ID: h:7da7a4ad-5d3a-4f11-9796-5a1abed0f0c4 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In +this section we show how to change the coloration of email message +headers and citations. Before we show the code, this is the anatomy +of a message: + +#+begin_example message +From: Protesilaos <info@protesilaos.com> +To: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> +Subject: Test subject +--- Headers above this line; message and citations below --- +This is some sample text + +> > Older quote +> Newer quote +#+end_example + +We thus have the following: + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + + +;; Reduce the intensity of mail citations and headers +(setq modus-themes-common-palette-overrides + '((mail-cite-0 cyan-faint) + (mail-cite-1 yellow-faint) + (mail-cite-2 green-faint) + (mail-cite-3 red-faint) + (mail-part olive) + (mail-recipient indigo) + (mail-subject maroon) + (mail-other slate))) + +;; Make mail citations more intense; adjust the headers accordingly +(setq modus-themes-common-palette-overrides + '((mail-cite-0 blue) + (mail-cite-1 yellow) + (mail-cite-2 green) + (mail-cite-3 magenta) + (mail-part magenta-cooler) + (mail-recipient cyan) + (mail-subject red-warmer) + (mail-other cyan-cooler))) + +;; Make all citations faint and neutral; make most headers green but +;; use red for the subject lie so that it stands out +(setq modus-themes-common-palette-overrides + '((mail-cite-0 fg-dim) + (mail-cite-1 fg-alt) + (mail-cite-2 fg-dim) + (mail-cite-3 fg-alt) + (mail-part yellow-cooler) + (mail-recipient green-cooler) + (mail-subject red-cooler) + (mail-other green))) +#+end_src + +*** Make the region preserve text colors, plus other styles +:PROPERTIES: +:CUSTOM_ID: h:c8605d37-66e1-42aa-986e-d7514c3af6fe +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). +Here we show how to make the region respect the underlying text colors +or how to make the background more/less intense while combining it +with an appropriate foreground value. + +[[#h:a5140c9c-18b2-45db-8021-38d0b5074116][Do not extend the region background]]. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + + +;; A background with no specific foreground (use foreground of +;; underlying text) +(setq modus-themes-common-palette-overrides + '((bg-region bg-ochre) ; try to replace `bg-ochre' with `bg-lavender', `bg-sage' + (fg-region unspecified))) + +;; Subtle gray with a prominent blue foreground +(setq modus-themes-common-palette-overrides + '((bg-region bg-dim) + (fg-region blue-cooler))) + +;; Intense magenta background combined with the main foreground +(setq modus-themes-common-palette-overrides + '((bg-region bg-magenta-intense) + (fg-region fg-main))) +#+end_src + +*** Make mouse highlights more or less colorful +:PROPERTIES: +:CUSTOM_ID: h:b5cab69d-d7cb-451c-8ff9-1f545ceb6caf +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In +the following code block we show how to affect the semantic color +mapping that covers mouse hover effects and related highlights: + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + + +;; Make the background an intense yellow +(setq modus-themes-common-palette-overrides + '((bg-hover bg-yellow-intense))) + +;; Make the background subtle green +(setq modus-themes-common-palette-overrides + '((bg-hover bg-green-subtle))) +#+end_src + +*** Make language underlines less colorful +:PROPERTIES: +:CUSTOM_ID: h:03dbd5af-6bae-475e-85a2-cec189f69598 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). +Here we show how to affect the color of the underlines that are used +by code linters and prose spell checkers. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + + +;; Make the underlines less intense +(setq modus-themes-common-palette-overrides + '((underline-err red-faint) + (underline-warning yellow-faint) + (underline-note cyan-faint))) + +;; Change the color-coding of the underlines +(setq modus-themes-common-palette-overrides + '((underline-err yellow-intense) + (underline-warning magenta-intense) + (underline-note green-intense))) +#+end_src + +*** Make line numbers use alternative styles +:PROPERTIES: +:CUSTOM_ID: h:b6466f51-cb58-4007-9ebe-53a27af655c7 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In +this section we show how to affect the ~display-line-numbers-mode~. + +#+begin_src emacs-lisp +;; These overrides are common to all Modus themes. We also provide +;; theme-specific options, such as `modus-operandi-palette-overrides'. +;; +;; In general, the theme-specific overrides are better for overriding +;; color values, such as redefining what `blue-faint' looks like. The +;; common overrides are best used for changes to semantic color +;; mappings, as we show below. + + +;; Make line numbers less intense +(setq modus-themes-common-palette-overrides + '((fg-line-number-inactive "gray50") + (fg-line-number-active fg-main) + (bg-line-number-inactive unspecified) + (bg-line-number-active unspecified))) + +;; Like the above, but use a shade of red for the current line number +(setq modus-themes-common-palette-overrides + '((fg-line-number-inactive "gray50") + (fg-line-number-active red-cooler) + (bg-line-number-inactive unspecified) + (bg-line-number-active unspecified))) + +;; Make all numbers more intense, use a more pronounce gray +;; background, and make the current line have a colored background +(setq modus-themes-common-palette-overrides + '((fg-line-number-inactive fg-main) + (fg-line-number-active fg-main) + (bg-line-number-inactive bg-inactive) + (bg-line-number-active bg-cyan-intense))) +#+end_src + +*** Make diffs use only a foreground +:PROPERTIES: +:CUSTOM_ID: h:b3761482-bcbf-4990-a41e-4866fb9dad15 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In +this section we show how to change diff buffers (e.g. in ~magit~) to +only use color-coded text without any added background. What we +basically do is to disable the applicable backgrounds and then +intensify the foregrounds. Since the deuteranopia-optimized themes do +not use the red-green color coding, we make an extra set of +adjustments for them by overriding their palettes directly instead of +just using the "common" overrides. + +#+begin_src emacs-lisp +;; Diffs with only foreground colors. Word-wise ("refined") diffs +;; have a gray background to draw attention to themselves. +(setq modus-themes-common-palette-overrides + '((bg-added unspecified) + (bg-added-faint unspecified) + (bg-added-refine bg-inactive) + (fg-added green) + (fg-added-intense green-intense) + + (bg-changed unspecified) + (bg-changed-faint unspecified) + (bg-changed-refine bg-inactive) + (fg-changed yellow) + (fg-changed-intense yellow-intense) + + (bg-removed unspecified) + (bg-removed-faint unspecified) + (bg-removed-refine bg-inactive) + (fg-removed red) + (fg-removed-intense red-intense) + + (bg-diff-context unspecified))) + +;; Because deuteranopia cannot use the typical red-yellow-green +;; combination, we need to arrange for a yellow-purple-blue sequence. +;; Notice that the above covers the "common" overrides, so we do not +;; need to reproduce the whole list of them. +(setq modus-operandi-deuteranopia-palette-overrides + '((fg-added blue) + (fg-added-intense blue-intense) + + (fg-changed magenta-cooler) + (fg-changed-intense magenta-intense) + + (fg-removed yellow-warmer) + (fg-removed-intense yellow-intense))) + +(setq modus-vivendi-deuteranopia-palette-overrides + '((fg-added blue) + (fg-added-intense blue-intense) + + (fg-changed magenta-cooler) + (fg-changed-intense magenta-intense) + + (fg-removed yellow) + (fg-removed-intense yellow-intense))) +#+end_src + +*** Make deuteranopia diffs red and blue instead of yellow and blue +:PROPERTIES: +:CUSTOM_ID: h:16389ea1-4cb6-4b18-9409-384324113541 +:END: + +This is one of our practical examples to override the semantic colors +of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In +this section we show how to implement a red+blue color coding for +diffs in the themes ~modus-operandi-deuteranopia~ and +~modus-vivendi-deuteranopia~. As those themes are optimized for users +with red-green color deficiency, they do not use the typical red+green +color coding for diffs, defaulting instead to yellow+blue which are +discernible. Users with deuteranomaly or, generally, those who like a +different aesthetic, can use the following to make diffs use the +red+yellow+blue color coding for removed, changed, and added lines +respectively. This is achieved by overriding the "changed" and +"removed" entries to use the colors of regular ~modus-operandi~ and +~modus-vivendi~. + +#+begin_src emacs-lisp +(setq modus-operandi-deuteranopia-palette-overrides + '((bg-changed "#ffdfa9") + (bg-changed-faint "#ffefbf") + (bg-changed-refine "#fac090") + (bg-changed-fringe "#d7c20a") + (fg-changed "#553d00") + (fg-changed-intense "#655000") + + (bg-removed "#ffd8d5") + (bg-removed-faint "#ffe9e9") + (bg-removed-refine "#f3b5af") + (bg-removed-fringe "#d84a4f") + (fg-removed "#8f1313") + (fg-removed-intense "#aa2222"))) + +(setq modus-vivendi-deuteranopia-palette-overrides + '((bg-changed "#363300") + (bg-changed-faint "#2a1f00") + (bg-changed-refine "#4a4a00") + (bg-changed-fringe "#8a7a00") + (fg-changed "#efef80") + (fg-changed-intense "#c0b05f") + + (bg-removed "#4f1119") + (bg-removed-faint "#380a0f") + (bg-removed-refine "#781a1f") + (bg-removed-fringe "#b81a1f") + (fg-removed "#ffbfbf") + (fg-removed-intense "#ff9095"))) +#+end_src + +*** Make the themes look like what the maintainer uses +:PROPERTIES: +:CUSTOM_ID: h:aabcada6-810d-4eee-b34a-d2a9c301824d +:END: + +Based on what we have learnt from the previous sections of this +manual, here is what Protesilaos uses: + +#+begin_src emacs-lisp +;; Always reload the theme for changes to take effect! + +(setq modus-themes-custom-auto-reload nil + modus-themes-to-toggle '(modus-operandi modus-vivendi) + modus-themes-mixed-fonts t + modus-themes-variable-pitch-ui nil + modus-themes-italic-constructs t + modus-themes-bold-constructs nil + modus-themes-org-blocks nil + modus-themes-completions '((t . (extrabold))) + modus-themes-prompts nil + modus-themes-headings + '((agenda-structure . (variable-pitch light 2.2)) + (agenda-date . (variable-pitch regular 1.3)) + (t . (regular 1.15)))) + +(setq modus-themes-common-palette-overrides + '((cursor magenta-cooler) + ;; Make the fringe invisible. + (fringe unspecified) + ;; Make line numbers less intense and add a shade of cyan + ;; for the current line number. + (fg-line-number-inactive "gray50") + (fg-line-number-active cyan-cooler) + (bg-line-number-inactive unspecified) + (bg-line-number-active unspecified) + ;; Make the current line of `hl-line-mode' a fine shade of + ;; gray (though also see my `lin' package). + (bg-hl-line bg-dim) + ;; Make the region have a cyan-green background with no + ;; specific foreground (use foreground of underlying text). + ;; "bg-sage" refers to Salvia officinalis, else the common + ;; sage. + (bg-region bg-sage) + (fg-region unspecified) + ;; Make matching parentheses a shade of magenta. It + ;; complements the region nicely. + (bg-paren-match bg-magenta-intense) + ;; Make email citations faint and neutral, reducing the + ;; default four colors to two; make mail headers cyan-blue. + (mail-cite-0 fg-dim) + (mail-cite-1 blue-faint) + (mail-cite-2 fg-dim) + (mail-cite-3 blue-faint) + (mail-part cyan-warmer) + (mail-recipient blue-warmer) + (mail-subject magenta-cooler) + (mail-other cyan-warmer) + ;; Change dates to a set of more subtle combinations. + (date-deadline magenta-cooler) + (date-scheduled magenta) + (date-weekday fg-main) + (date-event fg-dim) + (date-now blue-faint) + ;; Make tags (Org) less colorful and tables look the same as + ;; the default foreground. + (prose-done cyan-cooler) + (prose-tag fg-dim) + (prose-table fg-main) + ;; Make headings less colorful (though I never use deeply + ;; nested headings). + (fg-heading-2 blue-faint) + (fg-heading-3 magenta-faint) + (fg-heading-4 blue-faint) + (fg-heading-5 magenta-faint) + (fg-heading-6 blue-faint) + (fg-heading-7 magenta-faint) + (fg-heading-8 blue-faint) + ;; Make the active mode line a fine shade of lavender + ;; (purple) and tone down the gray of the inactive mode + ;; lines. + (bg-mode-line-active bg-lavender) + (border-mode-line-active bg-lavender) + + (bg-mode-line-inactive bg-dim) + (border-mode-line-inactive bg-inactive) + ;; Make the prompts a shade of magenta, to fit in nicely with + ;; the overall blue-cyan-purple style of the other overrides. + ;; Add a nuanced background as well. + (bg-prompt bg-magenta-nuanced) + (fg-prompt magenta-cooler) + ;; Tweak some more constructs for stylistic constistency. + (name blue-warmer) + (identifier magenta-faint) + (keybind magenta-cooler) + (accent-0 magenta-cooler) + (accent-1 cyan-cooler) + (accent-2 blue-warmer) + (accent-3 red-cooler))) + +;; Make the active mode line have a pseudo 3D effect (this assumes +;; you are using the default mode line and not an extra package). +(custom-set-faces + '(mode-line ((t :box (:style released-button))))) +#+end_src + +** More accurate colors in terminal emulators +:PROPERTIES: +:CUSTOM_ID: h:fbb5e254-afd6-4313-bb05-93b3b4f67358 +:END: +#+cindex: Color accuracy of terminal emulators + +[ This is based on partial information. Please help verify and/or + expand these findings. ] + +The graphical version of Emacs can reproduce color values accurately. +Whereas things get more tricky when Emacs is used in a terminal +emulator, because the terminals' own capabilities determine the number +of colors that may be displayed: the Modus themes don't look as good in +that case. + +There is, however, a way to instruct supported terminal emulators to use +more accurate colors. In a shell prompt type =toe -a | grep direct= to +get a list of relevant terminfo entries. There should be items such as +=xterm-direct=, =alacritty-direct=, =kitty-direct=. Once you find the one +that corresponds to your terminal, call Emacs with an environment +variable like =TERM=xterm-direct=. Example that can be adapted to shell +aliases: + +: TERM=xterm-direct emacsclient -nw + +Another example that can be bound to a key: + +: TERM=xterm-direct uxterm -e emacsclient -nw + +** Range of color with terminal emulators +:PROPERTIES: +:CUSTOM_ID: h:6b8211b0-d11b-4c00-9543-4685ec3b742f +:END: +#+cindex: Pure white and pure black in terminal emulators + +[ This is based on partial information. Please help verify and/or + expand these findings. ] + +When Emacs runs in a non-windowed session its color reproduction +capacity is framed or determined by the underlying terminal emulator +([[#h:fbb5e254-afd6-4313-bb05-93b3b4f67358][More accurate colors in terminal emulators]]). Emacs cannot produce a +color that lies outside the range of what the terminal's color palette +renders possible. + +This is immediately noticeable when the terminal's first 16 codes do not +include a pure black value for the =termcol0= entry and a pure white for +=termcol15=. Emacs cannot set the correct background (white for +~modus-operandi~; black for ~modus-vivendi~) or foreground (inverse of +the background). It thus falls back to the closest approximation, which +seldom is appropriate for the purposes of the Modus themes. + +In such a case, the user is expected to update their terminal's color +palette such as by adapting these resources ([[#h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d][Preview theme colors]]): + +#+begin_src emacs-lisp +! Theme: modus-operandi +! Description: XTerm port of modus-operandi (Modus themes for GNU Emacs) +! Author: Protesilaos Stavrou, <https://protesilaos.com> +xterm*background: #ffffff +xterm*foreground: #000000 +xterm*color0: #000000 +xterm*color1: #a60000 +xterm*color2: #005e00 +xterm*color3: #813e00 +xterm*color4: #0031a9 +xterm*color5: #721045 +xterm*color6: #00538b +xterm*color7: #bfbfbf +xterm*color8: #595959 +xterm*color9: #972500 +xterm*color10: #315b00 +xterm*color11: #70480f +xterm*color12: #2544bb +xterm*color13: #5317ac +xterm*color14: #005a5f +xterm*color15: #ffffff + +! Theme: modus-vivendi +! Description: XTerm port of modus-vivendi (Modus themes for GNU Emacs) +! Author: Protesilaos Stavrou, <https://protesilaos.com> +xterm*background: #000000 +xterm*foreground: #ffffff +xterm*color0: #000000 +xterm*color1: #ff8059 +xterm*color2: #44bc44 +xterm*color3: #d0bc00 +xterm*color4: #2fafff +xterm*color5: #feacd0 +xterm*color6: #00d3d0 +xterm*color7: #bfbfbf +xterm*color8: #595959 +xterm*color9: #ef8b50 +xterm*color10: #70b900 +xterm*color11: #c0c530 +xterm*color12: #79a8ff +xterm*color13: #b6a0ff +xterm*color14: #6ae4b9 +xterm*color15: #ffffff +#+end_src + +** Preview theme colors +:properties: +:custom_id: h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d +:end: +#+cindex: Preview named colors or semantic color mappings + +#+findex: modus-themes-list-colors +The command ~modus-themes-list-colors~ uses minibuffer completion to +select an item from the Modus themes and then produces a buffer with +previews of its color palette entries. The buffer has a naming scheme +that reflects the given choice, like =modus-operandi-list-colors= for +the ~modus-operandi~ theme. + +#+findex: modus-themes-list-colors-current +The command ~modus-themes-list-colors-current~ skips the minibuffer +selection process and just produces a preview for the current Modus +theme. + +When called with a prefix argument (=C-u= with the default key +bindings), these commands will show a preview of the palette's +semantic color mappings instead of the named colors. In this context, +"named colors" are entries that associate a symbol to a string color +value, such as =(blue-warmer "#354fcf")=. Whereas "semantic color +mappings" associate a named color to a symbol, like =(string +blue-warmer)=, thus making the theme render all string constructs in +the =blue-warmer= color value ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). + +#+findex: modus-themes-preview-colors +#+findex: modus-themes-preview-colors-current +Aliases for those commands are ~modus-themes-preview-colors~ and +~modus-themes-preview-colors-current~. + +Each row shows a foreground and background coloration using the +underlying value it references. For example a line with =#a60000= (a +shade of red) will show red text followed by a stripe with that same +color as a backdrop. + +The name of the buffer describes the given Modus theme and what the +contents are, such as =*modus-operandi-list-colors*= for named colors +and ==*modus-operandi-list-mappings*= for the semantic color mappings. + +** Per-theme customization settings +:properties: +:custom_id: h:a897b302-8e10-4a26-beab-3caaee1e1193 +:end: + +If you prefer to maintain different customization options between the +two themes, it is best you write your own functions that first set those +options and then load the relevant theme. The following code does +exactly that by simply differentiating the two themes on the choice of +bold constructs in code syntax (enabled for one, disabled for the +other). + +#+begin_src emacs-lisp +(defun my-demo-modus-operandi () + (interactive) + (setq modus-themes-bold-constructs t) ; ENABLE bold + (modus-themes-load-theme 'modus-operandi)) + +(defun my-demo-modus-vivendi () + (interactive) + (setq modus-themes-bold-constructs nil) ; DISABLE bold + (modus-themes-load-theme 'modus-vivendi)) + +(defun my-demo-modus-themes-toggle () + (if (eq (car custom-enabled-themes) 'modus-operandi) + (my-demo-modus-vivendi) + (my-demo-modus-operandi))) +#+end_src + +Then assign ~my-demo-modus-themes-toggle~ to a key instead of the +equivalent the themes provide. + +For a more elaborate design, it is better to inspect the source code of +~modus-themes-toggle~ and relevant functions. + +** Get a single color from the palette +:PROPERTIES: +:CUSTOM_ID: h:1cc552c1-5f5f-4a56-ae78-7b69e8512c4e +:END: + +[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]]. + +#+findex: modus-themes-get-color-value +The fuction ~modus-themes-get-color-value~ can be called from Lisp to +return the value of a color from the active Modus theme palette. It +takea a =COLOR= argument and an optional =OVERRIDES=. + +=COLOR= is a symbol that represents a named color entry in the +palette. + +[[#h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d][Preview theme colors]]. + +If the value is the name of another color entry in the palette (so a +mapping), this function recurs until it finds the underlying color +value. + +With an optional =OVERRIDES= argument as a non-~nil~ value, it accounts +for palette overrides. Else it reads only the default palette. + +[[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]. + +With optional =THEME= as a symbol among ~modus-themes-items~ (alias +~modus-themes-collection~), use the palette of that item. Else use +the current Modus theme. + +If =COLOR= is not present in the palette, this function returns the +~unspecified~ symbol, which is safe when used as a face attribute's +value. + +An example with ~modus-operandi~ to show how this function behaves +with/without overrides and when recursive mappings are introduced. + +#+begin_src emacs-lisp +;; Here we show the recursion of palette mappings. In general, it is +;; better for the user to specify named colors to avoid possible +;; confusion with their configuration, though those still work as +;; expected. +(setq modus-themes-common-palette-overrides + '((cursor red) + (fg-mode-line-active cursor) + (border-mode-line-active fg-mode-line-active))) + +;; Ignore the overrides and get the original value. +(modus-themes-get-color-value 'border-mode-line-active) +;; => "#5a5a5a" + +;; Read from the overrides and deal with any recursion to find the +;; underlying value. +(modus-themes-get-color-value 'border-mode-line-active :overrides) +;; => "#a60000" +#+end_src + +** Use theme colors in code with modus-themes-with-colors +:properties: +:custom_id: h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae +:end: +#+cindex: Use colors from the palette anywhere + +[[#h:1cc552c1-5f5f-4a56-ae78-7b69e8512c4e][Get a single color from the palette]]. + +Note that users most probably do not need the following. Just rely on +the comprehensive overrides we provide ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). + +#+findex: modus-themes-with-colors +Advanced users may want to apply colors from the palette of the active +Modus theme in their custom code. The ~modus-themes-with-colors~ +macro supplies those to any form called inside of it. For example: + +#+begin_src emacs-lisp +(modus-themes-with-colors + (list blue-warmer magenta-cooler fg-added warning variable fg-heading-4)) +;; => ("#354fcf" "#531ab6" "#005000" "#884900" "#005e8b" "#721045") +#+end_src + +The above return value is for ~modus-operandi~ when that is the active +theme. Switching to another theme and evaluating this code anew will +give us the relevant results for that theme (remember that since +version 4, the Modus themes consist of six items ([[#h:f0f3dbcb-602d-40cf-b918-8f929c441baf][Overview]])). The +same with ~modus-vivendi~ as the active theme: + +#+begin_src emacs-lisp +(modus-themes-with-colors + (list blue-warmer magenta-cooler fg-added warning variable fg-heading-4)) +;; => ("#79a8ff" "#b6a0ff" "#a0e0a0" "#fec43f" "#00d3d0" "#feacd0") +#+end_src + +The ~modus-themes-with-colors~ has access to the whole palette of the +active theme, meaning that it can instantiate both (i) named colors +like =blue-warmer= and (ii) semantic color mappings like =warning=. +We provide commands to inspect those ([[#h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d][Preview theme colors]]). + +Others sections in this manual show how to use the aforementioned +macro ([[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]]). + +Because the ~modus-themes-with-colors~ will most likely be used to +customize faces, note that any function that calls it must be run at +startup after the theme loads. The same function must also be +assigned to the ~modus-themes-after-load-theme-hook~ for its effects +to persist and be updated when switching between Modus themes (e.g. to +update the exact value of =blue-warmer= when toggling between +~modus-operandi~ to ~modus-vivendi~. + +** Do not extend the region background +:PROPERTIES: +:CUSTOM_ID: h:a5140c9c-18b2-45db-8021-38d0b5074116 +:END: + +By the default, the background of the ~region~ face extends from the +end of the line to the edge of the window. To limit it to the end of +the line, we need to override the face's =:extend= attribute. Adding +this to the Emacs configuration file will suffice: + +#+begin_src emacs-lisp +;; Do not extend `region' background past the end of the line. +(custom-set-faces + '(region ((t :extend nil)))) +#+end_src + +[[#h:c8605d37-66e1-42aa-986e-d7514c3af6fe][Make the region preserve text colors, plus other styles]]. + +** Add padding to mode line +:PROPERTIES: +:CUSTOM_ID: h:5a0c58cc-f97f-429c-be08-927b9fbb0a9c +:END: + +Emacs faces do not have a concept of "padding" for the space between +the text and its box boundaries. We can approximate the effect by +adding a =:box= attribute, making its border several pixels thick, and +using the mode line's background color for it. This way the thick +border will not stand out and will appear as a continuation of the +mode line. + +[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]]. + +#+begin_src emacs-lisp +(defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + ;; Add "padding" to the mode lines + `(mode-line ((,c :box (:line-width 10 :color ,bg-mode-line-active)))) + `(mode-line-inactive ((,c :box (:line-width 10 :color ,bg-mode-line-inactive))))))) + +(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) +#+end_src + +The above has the effect of removing the border around the mode lines. +In older versions of the themes, we provided the option for a padded +mode line which could also have borders around it. Those were not +real border, however, but an underline and an overline. Adjusting the +above: + +#+begin_src emacs-lisp +(defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + ;; Add "padding" to the mode lines + `(mode-line ((,c :underline ,border-mode-line-active + :overline ,border-mode-line-active + :box (:line-width 10 :color ,bg-mode-line-active)))) + `(mode-line-inactive ((,c :underline ,border-mode-line-inactive + :overline ,border-mode-line-inactive + :box (:line-width 10 :color ,bg-mode-line-inactive))))))) + +;; ESSENTIAL to make the underline move to the bottom of the box: +(setq x-underline-at-descent-line t) + +(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) +#+end_src + +The reason we no longer provide this option is because it depends on a +non-~nil~ value for ~x-underline-at-descent-line~. That variable +affects ALL underlines, including those of links. The effect is +intrusive and looks awkard in prose. + +As such, the Modus themes no longer provide that option but instead +offer this piece of documentation to make the user fully aware of the +state of affairs. + +** Remap face with local value +:properties: +:custom_id: h:7a93cb6f-4eca-4d56-a85c-9dcd813d6b0f +:end: +#+cindex: Remapping faces + +There are cases where we need to change the buffer-local attributes of a +face. This might be because we have our own minor mode that re-uses a +face for a particular purpose, such as a line selection tool that +activates ~hl-line-mode~, but we wish to keep it distinct from other +buffers. This is where ~face-remap-add-relative~ can be applied and may +be combined with ~modus-themes-with-colors~ to deliver consistent results. + +[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]]. + +In this example we will write a simple interactive function that adjusts +the background color of the ~region~ face. This is the sample code: + +#+begin_src emacs-lisp +(defvar my-rainbow-region-colors + (modus-themes-with-colors + `((red . ,bg-red-subtle) + (green . ,bg-green-subtle) + (yellow . ,bg-yellow-subtle) + (blue . ,bg-blue-subtle) + (magenta . ,bg-magenta-subtle) + (cyan . ,bg-cyan-subtle))) + "Sample list of color values for `my-rainbow-region'.") + +(defun my-rainbow-region (color) + "Remap buffer-local attribute of `region' using COLOR." + (interactive + (list + (completing-read "Pick a color: " my-rainbow-region-colors))) + (face-remap-add-relative + 'region + `( :background ,(alist-get (intern color) my-rainbow-region-colors) + :foreground ,(face-attribute 'default :foreground)))) +#+end_src + +When ~my-rainbow-region~ is called interactively, it prompts for a color +to use. The list of candidates is drawn from the car of each +association in ~my-rainbow-region-colors~ (so "red", "green", etc.). + +To extend this principle, we may write wrapper functions that pass a +color directly. Those can be useful in tandem with hooks. Consider +this example: + +#+begin_src emacs-lisp +(defun my-rainbow-region-magenta () + (my-rainbow-region 'magenta)) + +(add-hook 'diff-mode-hook #'my-rainbow-region-magenta) +#+end_src + +Whenever we enter a ~diff-mode~ buffer, we now get a magenta-colored +region. + +Perhaps you may wish to generalize those findings in to a set of +functions that also accept an arbitrary face. We shall leave the +experimentation up to you. + +** Font configurations for Org and others +:properties: +:custom_id: h:defcf4fc-8fa8-4c29-b12e-7119582cc929 +:end: +#+cindex: Font configurations + +The themes are designed to optionally cope well with mixed font +configurations. This mostly concerns ~org-mode~ and ~markdown-mode~, though +expect to find it elsewhere like in ~Info-mode~. + +[[#h:115e6c23-ee35-4a16-8cef-e2fcbb08e28b][Option for font mixing]]. + +In practice it means that the user can safely opt for a more +prose-friendly proportionately spaced typeface as their default, while +spacing-sensitive elements like tables and inline code always use a +monospaced font, by inheriting from the ~fixed-pitch~ face. + +Users can try the built-in {{{kbd(M-x variable-pitch-mode)}}} to see the +effect in action. + +To make everything use your desired font families, you need to configure +the ~variable-pitch~ (proportional spacing) and ~fixed-pitch~ (monospaced) +faces respectively. It may also be convenient to set your main typeface +by configuring the ~default~ face the same way. + +[ The ~fontaine~ package on GNU ELPA (by Protesilaos) is designed to + handle this case. ] + +Put something like this in your initialization file (also consider +reading the doc string of ~set-face-attribute~): + +#+begin_src emacs-lisp +;; Main typeface +(set-face-attribute 'default nil :family "DejaVu Sans Mono" :height 110) + +;; Proportionately spaced typeface +(set-face-attribute 'variable-pitch nil :family "DejaVu Serif" :height 1.0) + +;; Monospaced typeface +(set-face-attribute 'fixed-pitch nil :family "DejaVu Sans Mono" :height 1.5) +#+end_src + +Or employ the ~face-attribute~ function to read an existing value, such as +if you want to make ~fixed-pitch~ use the font family of the ~default~ face: + +#+begin_src emacs-lisp +(set-face-attribute 'fixed-pitch nil :family (face-attribute 'default :family)) +#+end_src + +The next section shows how to make those work in a more elaborate setup +that is robust to changes between the Modus themes. + +[[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]]. + +Note the differences in the ~:height~ property. The ~default~ face must +specify an absolute value, which is the point size × 10. So if you want +to use a font at point size =11=, you set the height to =110=.[fn:: ~:height~ +values do not need to be rounded to multiples of ten: the likes of =115= +are perfectly valid—some typefaces will change to account for those +finer increments.] Whereas every other face must either not specify a +height or have a value that is relative to the default, represented as a +floating point. If you use an integer, then that means an absolute +height. This is of paramount importance: it ensures that all fonts can +scale gracefully when using something like the ~text-scale-adjust~ command +which only operates on the base font size (i.e. the ~default~ face's +absolute height). + +[[#h:e6c5451f-6763-4be7-8fdb-b4706a422a4c][Note for EWW and Elfeed fonts]]. + +** Configure bold and italic faces +:properties: +:custom_id: h:2793a224-2109-4f61-a106-721c57c01375 +:end: +#+cindex: Bold and italic fonts + +The Modus themes do not hardcode a ~:weight~ or ~:slant~ attribute in the +thousands of faces they cover. Instead, they configure the generic +faces called ~bold~ and ~italic~ to use the appropriate styles and then +instruct all relevant faces that require emphasis to inherit from them. + +This practically means that users can change the particularities of what +it means for a construct to be bold/italic, by tweaking the ~bold~ and +~italic~ faces. Cases where that can be useful include: + ++ The default typeface does not have a variant with slanted glyphs + (e.g. Fira Mono/Code as of this writing on 2021-07-07), so the user + wants to add another family for the italics, such as Hack. + ++ The typeface of choice provides a multitude of weights and the user + prefers the light one by default. To prevent the bold weight from + being too heavy compared to the light one, they opt to make ~bold~ use a + semibold weight. + ++ The typeface distinguishes between oblique and italic forms by + providing different font variants (the former are just slanted + versions of the upright forms, while the latter have distinguishing + features as well). In this case, the user wants to specify the font + that applies to the ~italic~ face. + +To achieve those effects, one must first be sure that the fonts they use +have support for those features. It then is a matter of following the +instructions for all typeface tweaks. + +[[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and others]]. + +In this example, we set the default font family to Fira Code, while we +choose to render italics in the Hack typeface (obviously you need to +pick fonts that work well together): + +#+begin_src emacs-lisp +(set-face-attribute 'default nil :family "Fira Code" :height 110) +(set-face-attribute 'italic nil :family "Hack") +#+end_src + +And here we play with different weights, using Source Code Pro: + +#+begin_src emacs-lisp +(set-face-attribute 'default nil :family "Source Code Pro" :height 110 :weight 'light) +(set-face-attribute 'bold nil :weight 'semibold) +#+end_src + +To reset the font family, one can use this: + +#+begin_src emacs-lisp +(set-face-attribute 'italic nil :family 'unspecified) +#+end_src + +To ensure that the effects persist after switching between the Modus +themes (such as with {{{kbd(M-x modus-themes-toggle)}}}), the user needs to +write their configurations to a function and pass it to the +~modus-themes-after-load-theme-hook~. This is necessary because themes +set the styles of faces upon activation, overriding prior values where +conflicts occur between the previous and the current states (otherwise +changing themes would not be possible). + +[[#h:86f6906b-f090-46cc-9816-1fe8aeb38776][A theme-agnostic hook for theme loading]]. + +This is a minimal setup to preserve font configurations across theme +load phases. For a more permanent setup, it is better to rely on the +~custom-set-faces~ function: ~set-face-attribute~ works just fine, though it +probably is better suited for quick previews or for smaller scale +operations (~custom-set-faces~ follows the format used in the source code +of the themes, which can make it easier to redefine faces in bulk). + +#+begin_src emacs-lisp +;; our generic function +(defun my-modes-themes-bold-italic-faces () + (set-face-attribute 'default nil :family "Source Code Pro" :height 110) + (set-face-attribute 'bold nil :weight 'semibold)) + +;; or use this if you configure a lot of face and attributes and +;; especially if you plan to use `modus-themes-with-colors', as shown +;; elsewhere in the manual +(defun my-modes-themes-bold-italic-faces () + (custom-set-faces + '(default ((t :family "Source Code Pro" :height 110))) + '(bold ((t :weight semibold))))) + +;; and here is the hook +(add-hook 'modus-themes-after-load-theme-hook #'my-modes-themes-bold-italic-faces) +#+end_src + +[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]]. + +** Custom Org todo keyword and priority faces +:properties: +:custom_id: h:89f0678d-c5c3-4a57-a526-668b2bb2d7ad +:end: +#+cindex: Org custom todo faces + +Users of ~org-mode~ have the option to configure various keywords and +priority cookies to better match their workflow. User options are +~org-todo-keyword-faces~ and ~org-priority-faces~. + +As those are meant to be custom faces, it is futile to have the themes +guess what each user wants to use, which keywords to target, and so on. +Instead, we can provide guidelines on how to customize things to one's +liking with the intent of retaining the overall aesthetic of the themes. + +Please bear in mind that the end result of those is not controlled by +the active Modus theme but by how Org maps faces to its constructs. +Editing those while ~org-mode~ is active requires re-initialization of the +mode with {{{kbd(M-x org-mode-restart)}}} for changes to take effect. + +Let us assume you wish to visually differentiate your keywords. You +have something like this: + +#+begin_src emacs-lisp +(setq org-todo-keywords + '((sequence "TODO(t)" "|" "DONE(D)" "CANCEL(C)") + (sequence "MEET(m)" "|" "MET(M)") + (sequence "STUDY(s)" "|" "STUDIED(S)") + (sequence "WRITE(w)" "|" "WROTE(W)"))) +#+end_src + +You could then use a variant of the following to inherit from a face +that uses the styles you want and also to preserve the attributes +applied by the ~org-todo~ face (in case there is a difference between +the two): + +#+begin_src emacs-lisp +(setq org-todo-keyword-faces + '(("MEET" . (:inherit (bold org-todo))) + ("STUDY" . (:inherit (warning org-todo))) + ("WRITE" . (:inherit (shadow org-todo))))) +#+end_src + +This will refashion the keywords you specify, while letting the other +items in ~org-todo-keywords~ use their original styles, which are +defined in the ~org-todo~ and ~org-done~ faces. + +If you want back the defaults, try specifying just the ~org-todo~ face: + +#+begin_src emacs-lisp +(setq org-todo-keyword-faces + '(("MEET" . org-todo) + ("STUDY" . org-todo) + ("WRITE" . org-todo))) +#+end_src + +Or set ~org-todo-keyword-faces~ to ~nil~. + +When you inherit from multiple faces, you need to do it the way it is +shown further above. The order is significant: the first entry is +applied on top of the second, overriding any attributes that are +explicitly set for both of them: any attribute that is not specified +is not overridden, so, for example, if ~org-todo~ has a background and +a foreground, while ~font-lock-type-face~ only has a foreground, the +merged face will include the background of the former and the +foreground of the latter. If you do not want to blend multiple faces, +you only specify one by name without parentheses or an =:inherit= +keyword. A pattern of =keyword . face= will suffice. + +Both approaches can be used simultaneously, as illustrated in this +configuration of the priority cookies: + +#+begin_src emacs-lisp +(setq org-priority-faces + '((?A . (:inherit (bold org-priority))) + (?B . org-priority) + (?C . (:inherit (shadow org-priority))))) +#+end_src + +To find all the faces that are loaded in your current Emacs session, use +{{{kbd(M-x list-faces-display)}}}. Try {{{kbd(M-x describe-variable)}}} as well and +then specify the name of each of those Org variables demonstrated above. +Their documentation strings will offer you further guidance. + +Recall that the themes let you retrieve a color from their palette. Do +it if you plan to control face attributes. + +[[#h:02e25930-e71a-493d-828a-8907fc80f874][Check color combinations]]. + +** Custom Org emphasis faces +:properties: +:custom_id: h:26026302-47f4-4471-9004-9665470e7029 +:end: +#+cindex: Org custom emphasis faces + +Org provides the user option ~org-emphasis-alist~ which associates a +character with a face, list of faces, or face attributes. The default +specification of that variable looks like this: + +#+begin_src emacs-lisp +(setq org-emphasis-alist + '(("*" bold) + ("/" italic) + ("_" underline) + ("=" org-verbatim verbatim) + ("~" org-code verbatim) + ("+" (:strike-through t)))) +#+end_src + +With the exception of ~org-verbatim~ and ~org-code~ faces, everything else +uses the corresponding type of emphasis: a bold typographic weight, or +italicised, underlined, and struck through text. + +The best way for users to add some extra attributes, such as a +foreground color, is to define their own faces and assign them to the +given emphasis marker/character. + +This is a custom face that extends the standard ~bold~ face with a red +foreground value (so it colorises the text in addition to the bold +weight): + +#+begin_src emacs-lisp +(defface my-org-emphasis-bold + '((default :inherit bold) + (((class color) (min-colors 88) (background light)) + :foreground "#a60000") + (((class color) (min-colors 88) (background dark)) + :foreground "#ff8059")) + "My bold emphasis for Org.") +#+end_src + +This face definition reads as follows: + ++ Always inherit the ~bold~ face ([[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]]). ++ For versions of Emacs that support at least 88 colors (graphical + Emacs, for example) and use a light background, apply the =#a60000= + value. ++ For the same kind of Emacs that has a dark background use the =#ff8059= + color instead. + +Same principle for how to extend ~italic~ and ~underline~ with, for example, +green and yellow hues, respectively: + +#+begin_src emacs-lisp +(defface my-org-emphasis-italic + '((default :inherit italic) + (((class color) (min-colors 88) (background light)) + :foreground "#005e00") + (((class color) (min-colors 88) (background dark)) + :foreground "#44bc44")) + "My italic emphasis for Org.") + +(defface my-org-emphasis-underline + '((default :inherit underline) + (((class color) (min-colors 88) (background light)) + :foreground "#813e00") + (((class color) (min-colors 88) (background dark)) + :foreground "#d0bc00")) + "My underline emphasis for Org.") +#+end_src + +In the case of a strike-through effect, we have no generic face to +inherit from, so we can write it as follows to also change the +foreground to a more subtle gray: + +#+begin_src emacs-lisp +(defface my-org-emphasis-strike-through + '((default :strike-through t) + (((class color) (min-colors 88) (background light)) + :foreground "#505050") + (((class color) (min-colors 88) (background dark)) + :foreground "#a8a8a8")) + "My strike-through emphasis for Org.") +#+end_src + +Or we can just change the color of the line that strikes through the +text to, for example, a shade of red: + +#+begin_src emacs-lisp +(defface my-org-emphasis-strike-through + '((((class color) (min-colors 88) (background light)) + :strike-through "#972500") + (((class color) (min-colors 88) (background dark)) + :strike-through "#ef8b50")) + "My strike-through emphasis for Org.") +#+end_src + +It is possible to combine those effects: + +#+begin_src emacs-lisp +(defface my-org-emphasis-strike-through + '((((class color) (min-colors 88) (background light)) + :strike-through "#972500" :foreground "#505050") + (((class color) (min-colors 88) (background dark)) + :strike-through "#ef8b50" :foreground "#a8a8a8")) + "My strike-through emphasis for Org.") +#+end_src + +One may inspect the variables ~modus-themes-operandi-colors~ and +~modus-themes-vivendi-colors~ for possible color values. Or call the +command ~modus-themes-list-colors~ to show a buffer that previews each +entry in the palette. + +[[#h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d][Visualize the active Modus theme's palette]]. + +Once we have defined the faces we need, we must update the +~org-emphasis-alist~. Given that ~org-verbatim~ and ~org-code~ are already +styled by the themes, it probably is best not to edit them: + +#+begin_src emacs-lisp +(setq org-emphasis-alist + '(("*" my-org-emphasis-bold) + ("/" my-org-emphasis-italic) + ("_" my-org-emphasis-underline) + ("=" org-verbatim verbatim) + ("~" org-code verbatim) + ("+" my-org-emphasis-strike-through))) +#+end_src + +That's it! For changes to take effect in already visited Org files, +invoke {{{kbd(M-x org-mode-restart)}}}. + +** Update Org block delimiter fontification +:properties: +:custom_id: h:f44cc6e3-b0f1-4a5e-8a90-9e48fa557b50 +:end: + +As noted in the section about ~modus-themes-org-blocks~, Org contains a +variable that determines whether the block's begin and end lines are +extended to the edge of the window ([[#h:b7e328c0-3034-4db7-9cdf-d5ba12081ca2][Option for org-mode block styles]]). +The variable is ~org-fontify-whole-block-delimiter-line~. + +Users who change the style of Org blocks from time to time may prefer to +automatically update delimiter line fontification, such as with the +following setup: + +#+begin_src emacs-lisp +(defun my-modus-themes-org-fontify-block-delimiter-lines () + "Match `org-fontify-whole-block-delimiter-line' to theme style. +Run this function at the post theme load phase, such as with the +`modus-themes-after-load-theme-hook'." + (if (eq modus-themes-org-blocks 'gray-background) + (setq org-fontify-whole-block-delimiter-line t) + (setq org-fontify-whole-block-delimiter-line nil))) + +(add-hook 'modus-themes-after-load-theme-hook + #'my-modus-themes-org-fontify-block-delimiter-lines) +#+end_src + +Then {{{kbd(M-x org-mode-restart)}}} for changes to take effect, though manual +intervention can be circumvented by tweaking the function thus: + +#+begin_src emacs-lisp +(defun my-modus-themes-org-fontify-block-delimiter-lines () + "Match `org-fontify-whole-block-delimiter-line' to theme style. +Run this function at the post theme load phase, such as with the +`modus-themes-after-load-theme-hook'." + (if (eq modus-themes-org-blocks 'gray-background) + (setq org-fontify-whole-block-delimiter-line t) + (setq org-fontify-whole-block-delimiter-line nil)) + (when (derived-mode-p 'org-mode) + (font-lock-flush))) +#+end_src + +** Measure color contrast +:properties: +:custom_id: h:02e25930-e71a-493d-828a-8907fc80f874 +:end: +#+findex: modus-themes-contrast +#+findex: modus-themes-wcag-formula +#+cindex: Color contrast + +The themes provide the functions ~modus-themes-wcag-formula~ and +~modus-themes-contrast~. The former is a direct implementation of the +WCAG formula: <https://www.w3.org/TR/WCAG20-TECHS/G18.html>. It +calculates the relative luminance of a color value that is expressed in +hexadecimal RGB notation. While the latter function is just a +convenient wrapper for comparing the relative luminance between two +colors. + +In practice, one needs to work only with ~modus-themes-contrast~. It +accepts two color values and returns their contrast ratio. Values range +from 1 to 21 (lowest to highest). The themes are designed to always be +equal or higher than 7 for each combination of background and foreground +that they use (this is the WCAG AAA standard---the most demanding of its +kind). + +A couple of examples (rounded numbers): + +#+begin_src emacs-lisp +;; Pure white with pure green +(modus-themes-contrast "#ffffff" "#00ff00") +;; => 1.37 +;; That is an outright inaccessible combo + +;; Pure black with pure green +(modus-themes-contrast "#000000" "#00ff00") +;; => 15.3 +;; That is a highly accessible combo +#+end_src + +It does not matter which color value comes first. The ratio is always +the same. + +If one does not wish to read all the decimal points, it is possible to +try something like this: + +#+begin_src emacs-lisp +(format "%0.2f" (modus-themes-contrast "#000000" "#00ff00")) +#+end_src + +While it is fine to perform such calculations on a case-by-case basis, +it is preferable to implement formulas and tables for more demanding +tasks. Such instruments are provided by ~org-mode~ or ~orgtbl-mode~, both +of which are built into Emacs. Below is such a table that derives the +contrast ratio of all colors in the first column (pure red, green, blue) +relative to the color specified in the first row of the second column +(pure white) and rounds the results: + +#+begin_example +| | #ffffff | +|---------+---------| +| #ff0000 | 4.00 | +| #00ff00 | 1.37 | +| #0000ff | 8.59 | +#+tblfm: $2='(modus-themes-contrast $1 @1$2);%0.2f +#+end_example + +To measure color contrast one needs to start from a known value. This +typically is the background. The Modus themes define an expanded +palette in large part because certain colors are only meant to be used +in combination with some others. Consult the source code for the +minutia and relevant commentary. + +Such knowledge may prove valuable while attempting to customize the +theme's color palette. + +** Load theme depending on time of day +:properties: +:custom_id: h:1d1ef4b4-8600-4a09-993c-6de3af0ddd26 +:end: + +While we do provide ~modus-themes-toggle~ to manually switch between the +themes, users may also set up their system to perform such a task +automatically at sunrise and sunset. + +This can be accomplished by specifying the coordinates of one's +location using the built-in {{{file(solar.el)}}} and then configuring +the ~circadian~ package: + +#+begin_src emacs-lisp +(use-package solar ; built-in + :config + (setq calendar-latitude 35.17 + calendar-longitude 33.36)) + +(use-package circadian ; you need to install this + :ensure t + :after solar + :config + (setq circadian-themes '((:sunrise . modus-operandi) + (:sunset . modus-vivendi))) + (circadian-setup)) +#+end_src + +** Backdrop for pdf-tools +:properties: +:custom_id: h:ff69dfe1-29c0-447a-915c-b5ff7c5509cd +:end: +#+cindex: Remapping pdf-tools backdrop + +Most PDF files use a white background for their page, making it +impossible to discern the file's boundaries in the buffer while using +the Modus Operandi theme. To introduce a distinction between the +buffer's backdrop and the PDF page's background, the former must be +rendered as some shade of gray. Ideally, ~pdf-tools~ would provide a face +that the themes could support directly, though this does not seem to be +the case for the time being. We must thus employ the face remapping +technique that is documented elsewhere in this document to change the +buffer-local value of the ~default~ face. + +[[#h:7a93cb6f-4eca-4d56-a85c-9dcd813d6b0f][Remap face with local value]]. + +To remap the buffer's backdrop, we start with a function like this one: + +#+begin_src emacs-lisp +(defun my-pdf-tools-backdrop () + (modus-themes-with-colors + (face-remap-add-relative + 'default + `(:background ,bg-dim)))) + +(add-hook 'pdf-tools-enabled-hook #'my-pdf-tools-backdrop) +#+end_src + +The idea is to assign that function to a hook that gets called when +~pdf-tools~ renders the document: ~pdf-tools-enabled-hook~. This is enough +when you only use one theme. However it has the downside of setting the +background color value only at render time. In other words, the face +remapping function does not get evaluated anew whenever the theme +changes, such as upon invoking {{{kbd(M-x modus-themes-toggle)}}}. + +To have our face remapping adapt gracefully while switching between the +Modus themes, we need to also account for the current theme and control +the activation of ~pdf-view-midnight-minor-mode~. To which end we arrive +at something like the following, which builds on the above example: + +#+begin_src emacs-lisp +(defun my-pdf-tools-backdrop () + (modus-themes-with-colors + (face-remap-add-relative + 'default + `(:background ,bg-dim)))) + +(defun my-pdf-tools-midnight-mode-toggle () + (when (derived-mode-p 'pdf-view-mode) + (if (eq (car custom-enabled-themes) 'modus-vivendi) + (pdf-view-midnight-minor-mode 1) + (pdf-view-midnight-minor-mode -1)) + (my-pdf-tools-backdrop))) + +(defun my-pdf-tools-themes-toggle () + (mapc + (lambda (buf) + (with-current-buffer buf + (my-pdf-tools-midnight-mode-toggle))) + (buffer-list))) + +(add-hook 'pdf-tools-enabled-hook #'my-pdf-tools-midnight-mode-toggle) +(add-hook 'modus-themes-after-load-theme-hook #'my-pdf-tools-themes-toggle) +#+end_src + +With those in place, PDFs have a distinct backdrop for their page, while +buffers with major-mode as ~pdf-view-mode~ automatically switches to dark +mode when ~modus-themes-toggle~ is called. + +** Toggle themes without reloading them +:properties: +:custom_id: h:b40aca50-a3b2-4c43-be58-2c26fcd14237 +:end: +#+cindex: Switch themes without load-theme + +Users who have a stable setup and who only ever need to toggle between +the themes without triggering a full reload, are better off defining +their own command which calls ~enable-theme~ instead of ~load-theme~: + +#+begin_src emacs-lisp +(defun my-modus-themes-toggle () + "Toggle between `modus-operandi' and `modus-vivendi' themes. +This uses `enable-theme' instead of the standard method of +`load-theme'. The technicalities are covered in the Modus themes +manual." + (interactive) + (pcase (modus-themes--current-theme) + ('modus-operandi (progn (enable-theme 'modus-vivendi) + (disable-theme 'modus-operandi))) + ('modus-vivendi (progn (enable-theme 'modus-operandi) + (disable-theme 'modus-vivendi))) + (_ (error "No Modus theme is loaded; evaluate `modus-themes-load-themes' first")))) +#+end_src + +[[#h:e68560b3-7fb0-42bc-a151-e015948f8a35][Differences between loading and enabling]]. + +Recall that ~modus-themes-toggle~ uses ~load-theme~. + +** A theme-agnostic hook for theme loading +:properties: +:custom_id: h:86f6906b-f090-46cc-9816-1fe8aeb38776 +:end: + +The themes are designed with the intent to be useful to Emacs users of +varying skill levels, from beginners to experts. This means that we try +to make things easier by not expecting anyone reading this document to +be proficient in Emacs Lisp or programming in general. + +Such a case is with the use of ~modus-themes-after-load-theme-hook~, +which runs after the ~modus-themes-load-theme~ function (used by the +command ~modus-themes-toggle~). We recommend using that hook for +advanced customizations, because (1) we know for sure that it is +available once the themes are loaded, and (2) anyone consulting this +manual, especially the sections on enabling and loading the themes, +will be in a good position to benefit from that hook. + +Advanced users who have a need to switch between the Modus themes and +other items will find that such a hook does not meet their requirements: +it only works with the Modus themes and only with the aforementioned +functions. + +A theme-agnostic setup can be configured thus: + +#+begin_src emacs-lisp +(defvar after-enable-theme-hook nil + "Normal hook run after enabling a theme.") + +(defun run-after-enable-theme-hook (&rest _args) + "Run `after-enable-theme-hook'." + (run-hooks 'after-enable-theme-hook)) + +(advice-add 'enable-theme :after #'run-after-enable-theme-hook) +#+end_src + +This creates the ~after-enable-theme-hook~ and makes it run after each +call to ~enable-theme~, which means that it will work for all themes and +also has the benefit that it does not depend on functions such as +~modus-themes-toggle~ and the others mentioned above. ~enable-theme~ is +called internally by ~load-theme~, so the hook works everywhere. + +The downside of the theme-agnostic hook is that any functions added to +it will likely not be able to benefit from macro calls that read the +active theme, such as ~modus-themes-with-colors~. Not all Emacs +themes have the same capabilities. + +In this document, we cover ~modus-themes-after-load-theme-hook~ though +the user can replace it with ~after-enable-theme-hook~ should they +need to (provided they understand the implications). + +** Use more spacious margins or padding in Emacs frames +:PROPERTIES: +:CUSTOM_ID: h:43bcb5d0-e25f-470f-828c-662cee9e21f1 +:END: + +[ UPDATE 2023-06-25: Instead of following these instructions, you can + simply install my ~spacious-padding~ package from GNU ELPA. It + implements the padding and provides relevant user options. ] + +By default, Emacs frames try to maximize the number of characters that +fit in the current visible portion of the buffer. Users may prefer to +have some extra padding instead. This can make Emacs frames look more +pleasant, but also make it easier to identify the currently active +window. + +The way to implement such padding is two-fold: + +1. In the =early-init.el= file instruct Emacs to use a higher value + for the ~internal-border-width~ of all frames, as well as for the + ~right-divider-width~. The former concerns the outer boundaries of + Emacs frames, while the latter pertains to dividers between Emacs + windows. + +2. Make the relevant faces invisible by changing the value of their + relevant attributes to that of the current theme's main background. + +The parameters of Emacs frames are specified in the variables +~initial-frame-alist~ and ~default-frame-alist~. The "initial frame" +refers to the first frame that appears on Emacs startup. The +"default" refers to the fallback values that apply to all other frames +that Emacs creates (unless those are explicitly overridden by a +bespoke ~make-frame~ call). + +In detail, first we use the same values for the two frame alist variables: + +#+begin_src emacs-lisp +;; This must go in the early-init.el so that it applies to the initial +;; frame. +(dolist (var '(default-frame-alist initial-frame-alist)) + (add-to-list var '(right-divider-width . 20)) + (add-to-list var '(internal-border-width . 20))) +#+end_src + +What the ~dolist~ does is to call ~add-to-list~ for the two variables +we specify there. This economizes on typing. + +Then we define a function that makes the relevant faces invisible. +The reason we do this with a function is so we can hook it to the +"post load" phase of a theme, thus applying the new background value +(otherwise you keep the old background, which likely means that the +faces will no longer be invisible). + +#+begin_src emacs-lisp +(defun my-modus-themes-invisible-dividers () + "Make window dividers invisible. +Add this to the `modus-themes-post-load-hook'." + (let ((bg (face-background 'default))) + (custom-set-faces + `(fringe ((t :background ,bg :foreground ,bg))) + `(window-divider ((t :background ,bg :foreground ,bg))) + `(window-divider-first-pixel ((t :background ,bg :foreground ,bg))) + `(window-divider-last-pixel ((t :background ,bg :foreground ,bg)))))) + +(add-hook 'modus-themes-post-load-hook #'my-modus-themes-invisible-dividers) +#+end_src + +The above will work only for themes that belong to the Modus family. +For users of Emacs version 29 or higher, there exists a theme-agnostic +hook that takes a function with one argument---that of the theme---and +calls in the the "post enable" phase of theme loading. Here is the +above snippet, with the necessary tweaks: + +#+begin_src emacs-lisp +(defun my-modus-themes-invisible-dividers (_theme) + "Make window dividers for THEME invisible." + (let ((bg (face-background 'default))) + (custom-set-faces + `(fringe ((t :background ,bg :foreground ,bg))) + `(window-divider ((t :background ,bg :foreground ,bg))) + `(window-divider-first-pixel ((t :background ,bg :foreground ,bg))) + `(window-divider-last-pixel ((t :background ,bg :foreground ,bg)))))) + +(add-hook 'enable-theme-functions #'my-modus-themes-invisible-dividers) +#+end_src + +Users of older versions of Emacs can read the entry herein about +defining their own theme-agnostic hook ([[#h:86f6906b-f090-46cc-9816-1fe8aeb38776][A theme-agnostic hook for theme loading]]). + +** Custom hl-todo colors +:PROPERTIES: +:CUSTOM_ID: h:2ef83a21-2f0a-441e-9634-473feb940743 +:END: + +The ~hl-todo~ package provides the user option +~hl-todo-keyword-faces~: it specifies a pair of keyword and +corresponding color value. The Modus themes configure that option in +the interest of legibility. While this works for our purposes, users +may still prefer to apply their custom values, in which case the +following approach is necessary: + +#+begin_src emacs-lisp +(defun my-modus-themes-hl-todo-faces () + (setq hl-todo-keyword-faces '(("TODO" . "#ff0000") + ("HACK" . "#ffff00") + ("XXX" . "#00ffff") + ("NOTE" . "#ff00ff")))) + +(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces) +#+end_src + +Or include a ~let~ form, if needed: + +#+begin_src emacs-lisp +(defun my-modus-themes-hl-todo-faces () + (let ((red "#ff0000") + (blue "#0000ff")) + (setq hl-todo-keyword-faces `(("TODO" . ,blue) + ("HACK" . ,red) + ("XXX" . ,red) + ("NOTE" . ,blue))))) + +(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces) +#+end_src + +Normally, we do not touch user options, though this is an exception: +otherwise the defaults are not always legible. + +** Add support for solaire-mode +:PROPERTIES: +:CUSTOM_ID: h:439c9e46-52e2-46be-b1dc-85841dd99671 +:END: + +The ~solaire-mode~ package dims the background of what it considers +ancillary "UI" buffers, such as the minibuffer and Dired buffers. The +Modus themes used to support Solaire on the premise that the user was +(i) opting in to it, (ii) understood why certain buffers were more gray, +and (iii) knew what other adjustments had to be made to prevent broken +visuals (e.g. the default style of the ~modus-themes-completions~ uses a +subtle gray background for the selection, which with Solaire becomes +practically invisible). + +However, the assumption that users opt in to this feature does not +always hold true. There are cases where it is enabled by defaultsuch as +in the popular Doom Emacs configuration. Thus, the unsuspecting user +who loads ~modus-operandi~ or ~modus-vivendi~ without the requisite +customizations is getting a sub-par experience; an experience that we +did not intend and cannot genuinely fix. + +Because the Modus themes are meant to work everywhere, we cannot make an +exception for Doom Emacs and/or Solaire users. Furthermore, we shall +not introduce hacks, such as by adding a check in all relevant faces to +be adjusted based on Solaire or whatever other package. Hacks of this +sort are unsustainable and penalize the entire userbase. Besides, the +themes are built into Emacs and we must keep their standard high. + +The fundamental constraint with Solaire is that Emacs does not have a +real distinction between "content" and "UI" buffers. For themes to work +with Solaire, they need to be designed around that package. Such is an +arrangement that compromises on our accessibility standards and/or +hinders our efforts to provide the best possible experience while using +the Modus themes. + +As such, ~solaire-mode~ is not---and will not be---supported by the +Modus themes (or any other of my themes, for that matter). Users who +want it must style the faces manually. Below is some sample code, based +on what we cover at length elsewhere in this manual: + +[[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]]. + +[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]]. + +#+begin_src emacs-lisp +(defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + `(solaire-default-face ((,c :inherit default :background ,bg-dim :foreground ,fg-dim))) + `(solaire-line-number-face ((,c :inherit solaire-default-face :foreground ,fg-unfocused))) + `(solaire-hl-line-face ((,c :background ,bg-active))) + `(solaire-org-hide-face ((,c :background ,bg-dim :foreground ,bg-dim)))))) + +(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) +#+end_src + +As always, re-load the theme for changes to take effect. + +* Face coverage +:properties: +:custom_id: h:a9c8f29d-7f72-4b54-b74b-ddefe15d6a19 +:end: + +The Modus themes try to provide as close to full face coverage as +possible. This is necessary to ensure a consistently accessible reading +experience across all available interfaces. + +** Full support for packages or face groups +:properties: +:alt_title: Supported packages +:description: Full list of covered face groups +:custom_id: h:60ed4275-60d6-49f8-9287-9a64e54bea0e +:end: +#+cindex: Explicitly supported packages + +This list will always be updated to reflect the current state of the +project. The idea is to offer an overview of the known status of all +affected face groups. The items with an appended asterisk =*= tend to +have lots of extensions, so the "full support" may not be 100% true… + ++ ace-window ++ agda2-mode ++ all-the-icons ++ all-the-icons-dired ++ all-the-icons-ibuffer ++ annotate ++ ansi-color ++ anzu ++ auctex and TeX ++ auto-dim-other-buffers ++ avy ++ bbdb ++ binder ++ breadcrumb ++ bongo ++ boon ++ bookmark ++ calendar and diary ++ centaur-tabs ++ change-log and log-view (such as ~vc-print-log~, ~vc-print-root-log~) ++ chart ++ cider ++ circe ++ citar ++ clojure-mode ++ column-enforce-mode ++ company-mode* ++ compilation-mode ++ completions ++ consult ++ corfu ++ corfu-candidate-overlay ++ corfu-quick ++ counsel* ++ cperl-mode ++ crontab-mode ++ csv-mode ++ ctrlf ++ custom (what you get with {{{kbd(M-x customize)}}}) ++ dashboard ++ deadgrep ++ deft ++ devdocs ++ dictionary ++ diff-hl ++ diff-mode ++ dim-autoload ++ dired ++ dired-async ++ dired-git ++ dired-git-info ++ dired-narrow ++ dired-subtree ++ diredfl ++ disk-usage ++ display-fill-column-indicator-mode ++ doom-modeline ++ ediff ++ ein (Emacs IPython Notebook) ++ eglot ++ el-search ++ eldoc-box ++ elfeed ++ elfeed-score ++ elpher ++ embark ++ ement ++ emms ++ enh-ruby-mode (enhanced-ruby-mode) ++ epa ++ erc ++ ert ++ erts-mode ++ eshell ++ eshell-fringe-status ++ evil* (evil-mode) ++ eww ++ exwm ++ eyebrowse ++ flycheck ++ flycheck-color-mode-line ++ flycheck-indicator ++ flymake ++ flyspell ++ flx ++ focus ++ fold-this ++ font-lock (generic syntax highlighting) ++ geiser ++ git-commit ++ git-gutter (and variants) ++ git-rebase ++ git-timemachine ++ gnus ++ gotest ++ golden-ratio-scroll-screen ++ helpful ++ highlight-numbers ++ highlight-parentheses ([[#h:24bab397-dcb2-421d-aa6e-ec5bd622b913][Note on highlight-parentheses.el]]) ++ highlight-thing ++ hl-fill-column ++ hl-line-mode ++ hl-todo ++ hydra ++ ibuffer ++ icomplete ++ ido-mode ++ iedit ++ iflipb ++ image-dired ++ imenu-list ++ indium ++ info ++ info+ (info-plus) ++ info-colors ++ ioccur ++ isearch, occur, etc. ++ ivy* ++ ivy-posframe ++ japanese-holidays ++ jira (org-jira) ++ jit-spell ++ jinx ++ journalctl-mode ++ js2-mode ++ julia ++ kaocha-runner ++ keycast ++ ledger-mode ++ leerzeichen ++ line numbers (~display-line-numbers-mode~ and global variant) ++ magit ++ make-mode ++ man ++ marginalia ++ markdown-mode ++ markup-faces (~adoc-mode~) ++ messages ++ minimap ++ mode-line ++ mood-line ++ mpdel ++ mu4e ++ multiple-cursors ++ nerd-icons ++ nerd-icons-completion ++ nerd-icons-dired ++ nerd-icons-ibuffer ++ neotree ++ notmuch ++ num3-mode ++ nxml-mode ++ olivetti ++ orderless ++ org* ++ org-journal ++ org-noter ++ org-pomodoro ++ org-recur ++ org-roam ++ org-superstar ++ org-table-sticky-header ++ org-tree-slide ++ origami ++ outline-mode ++ outline-minor-faces ++ package (what you get with {{{kbd(M-x list-packages)}}}) ++ page-break-lines ++ pandoc-mode ++ paren-face ++ pass ++ pdf-tools ++ persp-mode ++ perspective ++ popup ++ powerline ++ prism ([[#h:a94272e0-99da-4149-9e80-11a7e67a2cf2][Note for prism.el]]) ++ prescient ++ proced ++ prodigy ++ pulse ++ pyim ++ quick-peek ++ rainbow-delimiters ++ rcirc ++ rcirc-color ++ recursion-indicator ++ regexp-builder (also known as ~re-builder~) ++ rg (rg.el) ++ ripgrep ++ rmail ++ rst-mode ++ ruler-mode ++ sesman ++ shell-script-mode ++ shortdoc ++ show-paren-mode ++ shr ++ side-notes ++ sieve-mode ++ skewer-mode ++ slime (slbd) ++ sly ++ smart-mode-line ++ smerge ++ speedbar ++ spell-fu ++ stripes ++ suggest ++ switch-window ++ swiper ++ symbol-overlay ++ syslog-mode ++ tab-bar-mode ++ tab-line-mode ++ table (built-in {{{file(table.el)}}}) ++ telega ++ terraform-mode ++ term ++ textsec ++ transient (pop-up windows such as Magit's) ++ trashed ++ tree-sitter ++ tty-menu ++ tuareg ++ typescript ++ undo-tree ++ vc ({{{file(vc-dir.el)}}}, {{{file(vc-hooks.el)}}}) ++ vertico ++ vertico-quick ++ vimish-fold ++ visible-mark ++ visual-regexp ++ vterm ++ vundo ++ wcheck-mode ++ web-mode ++ wgrep ++ which-function-mode ++ which-key ++ whitespace-mode ++ window-divider-mode ++ writegood-mode ++ woman ++ xah-elisp-mode ++ xterm-color (and ansi-colors) ++ yaml-mode ++ yasnippet + +Plus many other miscellaneous faces that are provided by Emacs. + +** Indirectly covered packages +:properties: +:custom_id: h:2cb359c7-3a84-4262-bab3-dcdc1d0034d7 +:end: +#+cindex: Implicitly supported packages + +These do not require any extra styles because they are configured to +inherit from some basic faces or their dependencies which are directly +supported by the themes. + ++ ag ++ apropos ++ apt-sources-list ++ bbdb ++ bm ++ breakpoint (provided by the built-in {{{file(gdb-mi.el)}}} library) ++ buffer-expose ++ bufler ++ counsel-notmuch ++ counsel-org-capture-string ++ css-mode ++ dashboard (emacs-dashboard) ++ define-word ++ denote ++ disk-usage ++ dtache ++ dynamic-ruler ++ easy-kill ++ ebdb ++ edit-indirect ++ egerrit ++ elfeed-summary ++ evil-owl ++ flyspell-correct ++ fortran-mode ++ freeze-it ++ forge ++ git-walktree ++ goggles ++ highlight-defined ++ highlight-escape-sequences (~hes-mode~) ++ icomplete-vertical ++ i3wm-config-mode ++ lin ++ minibuffer-line ++ no-emoji ++ org-remark ++ parrot ++ perl-mode ++ php-mode ++ pulsar ++ rjsx-mode ++ side-hustle ++ spell-fu ++ swift-mode ++ tab-bar-echo-area ++ tide ++ undo-hl ++ vdiff ++ vertico-indexed ++ vertico-mouse ++ xref + +* Notes on individual packages +:properties: +:custom_id: h:4c4d901a-84d7-4f20-bd99-0808c2b06eba +:end: + +This section covers information that may be of interest to users of +individual packages. + +** Note on calendar.el weekday and weekend colors +:properties: +:custom_id: h:b2db46fb-32f4-44fd-8e11-d2b261cf51ae +:end: + +By default, the {{{kbd(M-x calendar)}}} interface differentiates weekdays from +weekends by applying a gray color to the former and a faint red to the +latter. The idea for this approach is that the weekend should serve as +a subtle warning that no work is supposed to be done on that day, per +the design of traditional calendars. + +Users who prefer all days to look the same can configure the variable +~calendar-weekend-days~ to either use gray of weekdays or the faint red of +weekends uniformly. + +#+begin_src emacs-lisp +;; All are treated like weekdays (gray color) +(setq calendar-weekend-days nil) + +;; All are treated like weekends (red-faint color) +(setq calendar-weekend-days (number-sequence 0 6)) + +;; The default marks the Saturday and Sunday as the weekend +(setq calendar-weekend-days '(0 6)) +#+end_src + +For changes to take effect, the Calendar buffer needs to be generated +anew. + +** Note on git-gutter in Doom Emacs +:PROPERTIES: +:CUSTOM_ID: h:a195e37c-e58c-4148-b254-8ba1ed8a731a +:END: + +The ~git-gutter~ and ~git-gutter-fr~ packages default to drawing +bitmaps for the indicators they display (e.g. bitmap of a plus sign +for added lines). In Doom Emacs, these bitmaps are replaced with +contiguous lines which may look nicer, but require a change to the +foreground of the relevant faces to yield the desired color +combinations. + +Since this is Doom-specific, we urge users to apply changes in their +local setup. Below is some sample code, based on what we cover at +length elsewhere in this manual: + +[[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]]. + +[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]]. + +#+begin_src emacs-lisp +(defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + ;; Make foreground the same as background for a uniform bar on + ;; Doom Emacs. + ;; + ;; Doom should not be implementing such hacks because themes + ;; cannot support them: + ;; <https://protesilaos.com/codelog/2022-08-04-doom-git-gutter-modus-themes/>. + `(git-gutter-fr:added ((,c :foreground ,bg-added-fringe))) + `(git-gutter-fr:deleted ((,c :foreground ,bg-removed-fringe))) + `(git-gutter-fr:modified ((,c :foreground ,bg-changed-fringe)))))) + +(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) +#+end_src + +As always, re-load the theme for changes to take effect. + +If the above does not work, try this instead: + +#+begin_src emacs-lisp +(after! modus-themes + (modus-themes-with-colors + (custom-set-faces + ;; Make foreground the same as background for a uniform bar on + ;; Doom Emacs. + ;; + ;; Doom should not be implementing such hacks because themes + ;; cannot support them: + ;; <https://protesilaos.com/codelog/2022-08-04-doom-git-gutter-modus-themes/>. + `(git-gutter-fr:added ((,c :foreground ,bg-added-intense))) + `(git-gutter-fr:deleted ((,c :foreground ,bg-removed-intense))) + `(git-gutter-fr:modified ((,c :foreground ,bg-changed-intense)))))) +#+end_src + +** Note on php-mode multiline comments +:PROPERTIES: +:CUSTOM_ID: h:d0a3157b-9c04-46e8-8742-5fb2a7ae8798 +:END: + +Depending on your build of Emacs and/or the environment it runs in, +multiline comments in PHP with the ~php-mode~ package use the +~font-lock-doc-face~ instead of ~font-lock-comment-face~. + +This seems to make all comments use the appropriate face: + +#+begin_src emacs-lisp +(defun my-multine-comments () + (setq-local c-doc-face-name 'font-lock-comment-face)) + +(add-hook 'php-mode-hook #'my-multine-comments) +#+end_src + +As always, re-load the theme for changes to take effect. + +** Note on underlines in compilation buffers +:properties: +:custom_id: h:420f5a33-c7a9-4112-9b04-eaf2cbad96bd +:end: + +Various buffers that produce compilation results or run tests on code +apply an underline to the file names they reference or to relevant +messages. Users may consider this unnecessary or excessive. + +To outright disable the effect, use this (buffers need to be generated +anew): + +#+begin_src emacs-lisp +(setq compilation-message-face nil) +#+end_src + +If some element of differentiation is still desired, a good option is to +render the affected text with the ~italic~ face: + +#+begin_src emacs-lisp +(setq compilation-message-face 'italic) +#+end_src + +[[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]]. + +** Note on inline Latex in Org buffers +:properties: +:custom_id: h:dd8478da-f56a-45cd-b199-b836c85c3c5a +:end: + +Org can work with inline latex and related syntax. To actually fontify +those constructs, set the variable ~org-highlight-latex-and-related~ to +the desired list of values (per its doc string). For example: + +#+begin_src emacs-lisp +(setq org-highlight-latex-and-related '(latex script)) +#+end_src + +Remember to use {{{kbd(M-x org-mode-restart)}}} for changes to take effect. + +** Note on dimmer.el +:properties: +:custom_id: h:8eb4b758-d318-4480-9ead-357a571beb93 +:end: + +The {{{file(dimmer.el)}}} library by Neil Okamoto can be configured to +automatically dim the colors of inactive Emacs windows. To guarantee +consistent results with the Modus themes, we suggest some tweaks to the +default styles, such as in this minimal setup: + +#+begin_src emacs-lisp +(use-package dimmer + :config + (setq dimmer-fraction 0.3) + (setq dimmer-adjustment-mode :foreground) + (setq dimmer-use-colorspace :rgb) + + (dimmer-mode 1)) +#+end_src + +Of the above, we strongly recommend the RGB color space because it is +the one that remains faithful to the hueness of the colors used by the +themes. Whereas the default CIELAB space has a tendency to distort +colors in addition to applying the dim effect, which can be somewhat +disorienting. + +The value of the ~dimmer-fraction~ has been selected empirically. Users +might prefer to tweak it further (increasing it makes the dim effect +more pronounced). + +Changing the ~dimmer-adjustment-mode~ is a matter of preference. Though +because the Modus themes use black and white as their base colors, any +other value for that variable will turn the main background gray. This +inadvertently leads to the opposite of the intended utility of this +package: it draws too much attention to unfocused windows. + +** Note on display-fill-column-indicator-mode +:properties: +:custom_id: h:2a602816-bc1b-45bf-9675-4cbbd7bf6cab +:end: + +The ~display-fill-column-indicator-mode~ uses a typographic character to +draw its line. This has the downside of creating a dashed line. The +dashes are further apart depending on how tall the font's glyph height +is and what integer the ~line-spacing~ is set to. + +At the theme level we eliminate this effect by making the character one +pixel tall: the line is contiguous. Users who prefer the dashed line +are advised to change the ~fill-column-indicator~ face, as explained +elsewhere in this document. For example: + +#+begin_src emacs-lisp +(modus-themes-with-colors + (custom-set-faces + `(fill-column-indicator ((,c :foreground ,bg-active))))) +#+end_src + +[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]]. + +To make the line thicker, set the height to be equal to the base font +size instead of the one pixel we use. This is done by specifying a rate +instead of an absolute number, as in =:height 1.0= versus =:height 1=. +For example: + +#+begin_src emacs-lisp +(modus-themes-with-colors + (custom-set-faces + `(fill-column-indicator ((,c :height 1.0 :background ,bg-inactive :foreground ,bg-inactive))))) +#+end_src + +** Note on highlight-parentheses.el +:PROPERTIES: +:CUSTOM_ID: h:24bab397-dcb2-421d-aa6e-ec5bd622b913 +:END: + +The ~highlight-parentheses~ package provides contextual coloration of +surrounding parentheses, highlighting only those which are around the +point. The package expects users to customize the applicable colors +on their own by configuring certain variables. + +To make the Modus themes work as expected with this, we need to use some +of the techniques that are discussed at length in the various +"Do-It-Yourself" (DIY) sections, which provide insight into the more +advanced customization options of the themes. + +[[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]]. + +In the following example, we are assuming that the user wants to (i) +re-use color variables provided by the themes, (ii) be able to retain +their tweaks while switching between ~modus-operandi~ and ~modus-vivendi~, +and (iii) have the option to highlight either the foreground of the +parentheses or the background as well. + +We start by defining our own variable, which will serve as a toggle +between foreground and background coloration styles: + +#+begin_src emacs-lisp +(defvar my-highlight-parentheses-use-background t + "Prefer `highlight-parentheses-background-colors'.") +#+end_src + +Then we can update our preference with this: + +#+begin_src emacs-lisp +;; Set to nil to disable backgrounds. +(setq my-highlight-parentheses-use-background nil) +#+end_src + +To re-use colors from the themes, we must wrap our code in the +~modus-themes-with-colors~ macro. Our implementation must interface with +the variables ~highlight-parentheses-background-colors~ and/or +~highlight-parentheses-colors~. + +So we can have something like this (the doc string of +~modus-themes-with-colors~ explains where the names of the colors can be +found): + +#+begin_src emacs-lisp +(modus-themes-with-colors + ;; Our preference for setting either background or foreground + ;; styles, depending on `my-highlight-parentheses-use-background'. + (if my-highlight-parentheses-use-background + + ;; Here we set color combinations that involve both a background + ;; and a foreground value. + (setq highlight-parentheses-background-colors (list bg-cyan-intense + bg-magenta-intense + bg-green-intense + bg-yellow-intense) + highlight-parentheses-colors (list cyan + magenta + green + yellow)) + + ;; And here we pass only foreground colors while disabling any + ;; backgrounds. + (setq highlight-parentheses-colors (list green-intense + magenta-intense + blue-intense + red-intense) + highlight-parentheses-background-colors nil))) + +;; Include this if you also want to make the parentheses bold: +(set-face-attribute 'highlight-parentheses-highlight nil :inherit 'bold) + +;; Our changes must be evaluated before enabling the relevant mode, so +;; this comes last. +(global-highlight-parentheses-mode 1) +#+end_src + +For our changes to persist while switching between the Modus themes, we +need to include them in a function which can then get passed to +~modus-themes-after-load-theme-hook~. This is the complete +implementation: + +#+begin_src emacs-lisp +;; Configurations for `highlight-parentheses': +(require 'highlight-parentheses) + +(defvar my-highlight-parentheses-use-background t + "Prefer `highlight-parentheses-background-colors'.") + +(setq my-highlight-parentheses-use-background nil) ; Set to nil to disable backgrounds + +(defun my-modus-themes-highlight-parentheses () + (modus-themes-with-colors + ;; Our preference for setting either background or foreground + ;; styles, depending on `my-highlight-parentheses-use-background'. + (if my-highlight-parentheses-use-background + + ;; Here we set color combinations that involve both a background + ;; and a foreground value. + (setq highlight-parentheses-background-colors (list bg-cyan-intense + bg-magenta-intense + bg-green-intense + bg-yellow-intense) + highlight-parentheses-colors (list cyan + magenta + green + yellow)) + + ;; And here we pass only foreground colors while disabling any + ;; backgrounds. + (setq highlight-parentheses-colors (list green-intense + magenta-intense + blue-intense + red-intense) + highlight-parentheses-background-colors nil))) + + ;; Include this if you also want to make the parentheses bold: + (set-face-attribute 'highlight-parentheses-highlight nil :inherit 'bold) + + ;; Our changes must be evaluated before enabling the relevant mode, so + ;; this comes last. + (global-highlight-parentheses-mode 1)) + +(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-highlight-parentheses) +#+end_src + +As always, re-load the theme for changes to take effect. + +** Note on mmm-mode.el background colors +:properties: +:custom_id: h:99cf0d6c-e478-4e26-9932-3bf3427d13f6 +:end: + +The faces used by {{{file(mmm-mode.el)}}} are expected to have a colorful +background, while they should not touch any foreground value. The idea +is that they must not interfere with existing fontification. Those +background colors need to be distinct from each other, such as an +unambiguous red juxtaposed with a clear blue. + +While this design may be internally consistent with the raison d'être of +that library, it inevitably produces inaccessible color combinations. + +There are two competing goals at play: + +1. Legibility of the text, understood as the contrast ratio between the + background and the foreground. + +2. Semantic precision of each face which entails faithfulness to + color-coding of the underlying background. + +As the Modus themes are designed with the express purpose of conforming +with the first point, we have to forgo the apparent color-coding of the +background elements. Instead we use subtle colors that do not undermine +the legibility of the affected text while they still offer a sense of +added context. + +Users who might prefer to fall below the minimum 7:1 contrast ratio in +relative luminance (the accessibility target we conform with), can opt +to configure the relevant faces on their own. + +[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]]. + +This example uses more vivid background colors, though it comes at the +very high cost of degraded legibility. + +#+begin_src emacs-lisp +(modus-themes-with-colors + (custom-set-faces + `(mmm-cleanup-submode-face ((,c :background ,bg-yellow-intense))) + `(mmm-code-submode-face ((,c :background ,bg-inactive))) + `(mmm-comment-submode-face ((,c :background ,bg-blue-intense))) + `(mmm-declaration-submode-face ((,c :background ,bg-cyan-intense))) + `(mmm-default-submode-face ((,c :background ,bg-dim))) + `(mmm-init-submode-face ((,c :background ,bg-magenta-intense))) + `(mmm-output-submode-face ((,c :background ,bg-red-intense))) + `(mmm-special-submode-face ((,c :background ,bg-green-intense))))) +#+end_src + +** Note on prism.el +:properties: +:alt_title: Note for prism +:custom_id: h:a94272e0-99da-4149-9e80-11a7e67a2cf2 +:end: + +This package by Adam Porter, aka "alphapapa" or "github-alphapapa", +implements an alternative to the typical coloration of code. Instead of +highlighting the syntactic constructs, it applies color to different +levels of depth in the code structure. + +As {{{file(prism.el)}}} offers a broad range of customizations, we +cannot style it directly at the theme level: that would run contrary +to the spirit of the package. Instead, we may offer preset color +schemes. Those should offer a starting point for users to adapt to +their needs. + +In the following code snippets, we employ the ~modus-themes-with-colors~ +macro: [[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]]. + +These are the minimum recommended settings with 16 colors: + +#+begin_src emacs-lisp +(setq prism-num-faces 16) + +(prism-set-colors + :desaturations '(0) ; do not change---may lower the contrast ratio + :lightens '(0) ; same + :colors (modus-themes-with-colors + (list fg-main + magenta + cyan-cooler + magenta-cooler + blue + magenta-warmer + cyan-warmer + red-cooler + green + fg-main + cyan + yellow + blue-warmer + red-warmer + green-cooler + yellow-faint))) +#+end_src + +With 8 colors: + +#+begin_src emacs-lisp +(setq prism-num-faces 8) + +(prism-set-colors + :desaturations '(0) ; do not change---may lower the contrast ratio + :lightens '(0) ; same + :colors (modus-themes-with-colors + (list blue + magenta + magenta-cooler + cyan-cooler + fg-main + blue-warmer + red-cooler + cyan))) +#+end_src + +And this is with 4 colors, which produces results that are the closest +to the themes' default aesthetic: + +#+begin_src emacs-lisp +(setq prism-num-faces 4) + +(prism-set-colors + :desaturations '(0) ; do not change---may lower the contrast ratio + :lightens '(0) ; same + :colors (modus-themes-with-colors + (list blue + magenta + magenta-cooler + green-warmer))) +#+end_src + +If you need to apply desaturation and lightening, you can use what the +{{{file(prism.el)}}} documentation recommends, like this (adapting to the +examples with the 4, 8, 16 colors): + +#+begin_src emacs-lisp +(prism-set-colors + :desaturations (cl-loop for i from 0 below 16 collect (* i 2.5)) + :lightens (cl-loop for i from 0 below 16 collect (* i 2.5)) + :colors (modus-themes-with-colors + (list fg-main + cyan-cooler + magenta-cooler + magenta))) +#+end_src + +** Note on company-mode overlay pop-up +:properties: +:custom_id: h:20cef8c4-d11f-4053-8b2c-2872925780b1 +:end: + +By default, the ~company-mode~ pop-up that lists completion candidates is +drawn using an overlay. This creates alignment issues every time it is +placed above a piece of text that has a different height than the +default. + +The solution recommended by the project's maintainer is to use an +alternative front-end for drawing the pop-up which draws child frames +instead of overlays.[fn:: +https://github.com/company-mode/company-mode/issues/1010][fn:: +https://github.com/tumashu/company-posframe/] + +Also consider the ~corfu~ package. + +** Note on ERC escaped color sequences +:properties: +:custom_id: h:98bdf319-1e32-4469-8a01-771200fba65c +:end: + +The built-in IRC client ~erc~ has the ability to colorize any text using +escape sequences that start with =^C= (inserted with {{{kbd(C-q C-c)}}}) and are +followed by a number for the foreground and background.[fn:: This page +explains the basics, though it is not specific to Emacs: +https://www.mirc.com/colors.html] Possible numbers are 0-15, with the +first entry being the foreground and the second the background, +separated by a comma. Like this =^C1,6=. The minimum setup is this: + +#+begin_src emacs-lisp +(add-to-list 'erc-modules 'irccontrols) +(setq erc-interpret-controls-p t + erc-interpret-mirc-color t) +#+end_src + +As this allows users the chance to make arbitrary combinations, it is +impossible to guarantee a consistently high contrast ratio. All we can +we do is provide guidance on the combinations that satisfy the +accessibility standard of the themes: + ++ Modus Operandi :: Use foreground color 1 for all backgrounds from + 2-15. Like so: {{{kbd(C-q C-c1,N)}}} where =N= is the background. + ++ Modus Vivendi :: Use foreground color 0 for all backgrounds from + 2-13. Use foreground =1= for backgrounds 14, 15. + +Colors 0 and 1 are white and black respectively. So combine them +together, if you must. + +** Note on powerline or spaceline +:properties: +:custom_id: h:9130a8ba-d8e3-41be-a58b-3cb1eb7b6d17 +:end: + +Both Powerline and Spaceline package users will likely need to use the +command ~powerline-reset~ whenever they make changes to their themes +and/or mode line setup. + +** Note on SHR colors +:properties: +:custom_id: h:4cc767dc-ffef-4c5c-9f10-82eb7b8921bf +:end: + +Emacs' HTML rendering library ({{{file(shr.el)}}}) may need explicit +configuration to respect the theme's colors instead of whatever +specifications the webpage provides. + +Consult the doc string of ~shr-use-colors~. + +** Note on SHR fonts +:properties: +:custom_id: h:e6c5451f-6763-4be7-8fdb-b4706a422a4c +:end: +#+cindex: Fonts in EWW, Elfeed, Ement, and SHR + +By default, packages that build on top of the Simple HTML Remember +(~shr~) use proportionately spaced fonts. This is controlled by the +user option ~shr-use-fonts~, which is set to non-~nil~ by default. To +use the standard font instead, set that variable to ~nil~. + +[[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and others]]. + +Packages affected by this are: + ++ elfeed ++ ement ++ eww + +This is a non-exhaustive list. + +** Note on Ement colors and fonts +:properties: +:custom_id: h:8e636056-356c-4ca7-bc78-ebe61031f585 +:end: + +The {{{file(ement.el)}}} library by Adam Porter (also known as +"alphapapa") defaults to a method of colorizing usernames in a rainbow +style. This is controlled by the user option ~ement-room-prism~ and +can be disabled with: + +#+begin_src emacs-lisp +(setq ement-room-prism nil) +#+end_src + +The contrast ratio of these colors is governed by another user option: +~ement-room-prism-minimum-contrast~. By default, it is set to 6 which is +slightly below our nominal target. Try this instead: + +#+begin_src emacs-lisp +(setq ement-room-prism-minimum-contrast 7) +#+end_src + +With regard to fonts, Ement depends on ~shr~ ([[#h:e6c5451f-6763-4be7-8fdb-b4706a422a4c][Note on SHR fonts]]). + +Since we are here, here is an excerpt from Ement's source code: + +#+begin_src emacs-lisp +(defcustom ement-room-prism-minimum-contrast 6 + "Attempt to enforce this minimum contrast ratio for user faces. +This should be a reasonable number from, e.g. 0-7 or so." + ;; Prot would almost approve of this default. :) I would go all the way + ;; to 7, but 6 already significantly dilutes the colors in some cases. + :type 'number) +#+end_src + +Yes, I do approve of that default. Even a 4.5 (the WCAG AA rating) +would be a good baseline for many themes and/or user configurations. +Our target is the highest of the sort, though we do not demand that +everyone conforms with it. + +** Note on pdf-tools link hints +:properties: +:custom_id: h:2659d13e-b1a5-416c-9a89-7c3ce3a76574 +:end: + +Hints are drawn by [[https://imagemagick.org/][ImageMagick]], not Emacs, i.e., ImageMagick doesn't +know about the hint face unless you tell ImageMagick about it. By +default, only the foreground and background color attributes are +passed. The below snippet adds to those the various font attributes. As +it queries various faces, specifically ~pdf-links-read-link~ and the faces +it inherits, it needs to be added to your initialization file after +you've customized any faces. + +#+begin_src emacs-lisp +(use-package pdf-links + :config + (let ((spec + (apply #'append + (mapcar + (lambda (name) + (list name + (face-attribute 'pdf-links-read-link + name nil 'default))) + '(:family :width :weight :slant))))) + (setq pdf-links-read-link-convert-commands + `("-density" "96" + "-family" ,(plist-get spec :family) + "-stretch" ,(let* ((width (plist-get spec :width)) + (name (symbol-name width))) + (replace-regexp-in-string "-" "" + (capitalize name))) + "-weight" ,(pcase (plist-get spec :weight) + ('ultra-light "Thin") + ('extra-light "ExtraLight") + ('light "Light") + ('semi-bold "SemiBold") + ('bold "Bold") + ('extra-bold "ExtraBold") + ('ultra-bold "Black") + (_weight "Normal")) + "-style" ,(pcase (plist-get spec :slant) + ('italic "Italic") + ('oblique "Oblique") + (_slant "Normal")) + "-pointsize" "%P" + "-undercolor" "%f" + "-fill" "%b" + "-draw" "text %X,%Y '%c'")))) +#+end_src + +** Note on the Notmuch logo +:properties: +:custom_id: h:636af312-54a5-4918-84a6-0698e85a3c6d +:end: + +By default, the "hello" buffer of Notmuch includes a header with the +programs' logo and a couple of buttons. The logo has the effect of +enlarging the height of the line, which negatively impacts the shape of +those buttons. Disabling the logo fixes the problem: + +#+begin_src emacs-lisp +(setq notmuch-show-logo nil) +#+end_src + +** Note on goto-address-mode faces +:PROPERTIES: +:CUSTOM_ID: h:2d74236a-e41c-4616-8735-75f949a67334 +:END: + +The built-in ~goto-address-mode~ uses heuristics to identify URLs and +email addresses in the current buffer. It then applies a face to them +to change their style. Some packages, such as ~notmuch~, use this +minor-mode automatically. + +The faces are not declared with ~defface~, meaning that it is better +that the theme does not modify them. The user is thus encouraged to +consider including (or equivalent) this in their setup: + +#+begin_src emacs-lisp +(setq goto-address-url-face 'link + goto-address-url-mouse-face 'highlight + goto-address-mail-face 'link + goto-address-mail-mouse-face 'highlight) +#+end_src + +My personal preference is to set ~goto-address-mail-face~ to ~nil~, as +it otherwise adds too much visual noise to the buffer (email addresses +stand out more, due to the use of the uncommon =@= character but also +because they are often enclosed in angled brackets). + +* Frequently Asked Questions +:properties: +:custom_id: h:b3384767-30d3-4484-ba7f-081729f03a47 +:end: +#+cindex: Frequently Asked Questions + +In this section we provide answers related to some aspects of the Modus +themes' design and application. + +** Is the contrast ratio about adjacent colors? +:properties: +:custom_id: h:5ce7ae2e-9348-4e55-b4cf-9302345b1826 +:end: +#+cindex: Contrast between adjacent colors + +The minimum contrast ratio in relative luminance that the themes conform +with always refers to any given combination of background and foreground +colors. If we have some blue colored text next to a magenta one, both +against a white background, we do not mean to imply that blue:magenta is +7:1 in terms of relative luminance. Rather, we state that blue:white +and magenta:white each are 7:1 or higher. + +The point of reference is always the background. Because colors have +about the same minimum distance in luminance from their backdrop, they +necessarily are fairly close to each other in this measure. A possible +blue:magenta combination would naturally be around 1:1 in contrast of +the sort here considered. + +To differentiate between sequential colors, we rely on hueness by +mapping contrasting hues to adjacent constructs, while avoiding +exaggerations. A blue next to a magenta can be told apart regardless of +their respective contrast ratio against their common background. +Exceptions would be tiny characters in arguably not so realistic cases, +such as two dots drawn side-by-side which for some reason would need to +be colored differently. They would still be legible though, which is +the primary objective of the Modus themes. + +** What does it mean to avoid exaggerations? +:properties: +:custom_id: h:44284e1f-fab8-4c4f-92f0-544728a7c91e +:end: +#+cindex: Avoiding exaggerations in design + +The Modus themes are designed with restraint, so that their default +looks do not overdo it with the application of color. + +[[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization Options]]. + +This is the non-quantifiable aspect of the themes' design: the artistic +part, if you will. There are a lot of cases where color can be used +inconsiderately, without accounting for layout, typographic, or other +properties of the presentation. For example, two headings with distinct +markers, such as leading asterisks in Org buffers, do not have to have +highly contrasting hues between them in order to be told apart: the +added element of contrast in hueness does not contribute significantly +more to the distinction between the headings than colors whose hues are +relatively closer to each other in the color space. + +Exaggerations can be hard to anticipate or identify. Multiple shades of +blue and magenta in the same context may not seem optimal: one might +think that it would be better to use highly contrasting hues to ensure +that all colors stand out, such as by placing blue next to yellow, next +to magenta, and green. That would, however, be a case of design for its +own sake; a case where color is being applied without consideration of +its end results in the given context. Too many contrasting hues in +close proximity force an erratic rate to how the eye jumps from one +piece of text to the next. Whereas multiple shades of, say, blue and +magenta can suffice to tell things apart and avoid excess coloration: a +harmonious rhythm. + +** Why are colors mostly variants of blue, magenta, cyan? +:properties: +:custom_id: h:0b26cb47-9733-4cb1-87d9-50850cb0386e +:end: +#+cindex: Innate color qualities of the palette + +Due to the innate properties of color, some options are better than +others for the accessibility purposes of the themes, the stylistic +consistency between ~modus-operandi~ and ~modus-vivendi~, and the avoidance +of exaggerations in design. + +[[#h:44284e1f-fab8-4c4f-92f0-544728a7c91e][What does it mean to avoid exaggerations?]] + +What we describe as color is a function of three distinct channels of +light: red, green, blue. In hexadecimal RGB notation, a color value is +read as three pairs of red, green, and blue light: =#RRGGBB=. Of those +three, the most luminant is green, while the least luminant is blue. + +The three basic colors represent each of the channels of light. They +can be intermixed to give us six colors: red and green derive yellow, +green and blue make cyan, red and blue turn into magenta. + +We can test the luminance of each of those against white and black to +get a sense of how not all colors are equally good for accessibility +(white is =#ffffff=, which means that all three light channels are fully +luminated, while black is =#000000= meaning that no light is present +(notwithstanding display technology)). + +#+begin_example +| Name | | #ffffff | #000000 | +|---------+---------+---------+---------| +| red | #ff0000 | 4.00 | 5.25 | +| yellow | #ffff00 | 1.07 | 19.56 | +| green | #00ff00 | 1.37 | 15.30 | +| cyan | #00ffff | 1.25 | 16.75 | +| blue | #0000ff | 8.59 | 2.44 | +| magenta | #ff00ff | 3.14 | 6.70 | +#+end_example + +[[#h:02e25930-e71a-493d-828a-8907fc80f874][Measure color contrast]]. + +By reading this table we learn that every color that has a high level of +green light (green, yellow, cyan) is virtually unreadable against a +white background and, conversely, can be easily read against black. + +We can then infer that red and blue, in different combinations, with +green acting as calibrator for luminance, will give us fairly moderate +colors that pass the 7:1 target. Blue with a bit of green produce +appropriate variants of cyan. Similarly, blue combined with some red +and hints of green give us suitable shades of purple. + +Due to the need of maintaining some difference in hueness between +adjacent colors, it is not possible to make red, green, and yellow the +main colors, because blue cannot be used to control their luminance and, +thus the relevant space will shrink considerably. + +[[#h:5ce7ae2e-9348-4e55-b4cf-9302345b1826][Is the contrast ratio about adjacent colors?]] + +This phenomenon is best illustrated by the following table that measures +the relative luminance of shades of red, yellow, magenta against white: + +#+begin_example +| | #ffffff | +|---------+---------| +| #990000 | 8.92 | +| #995500 | 5.75 | +| #990099 | 7.46 | +#+end_example + +We notice that equal values of red and blue light in =#990099= (magenta +shade) do not lead to a considerable change in luminance compared with +=#990000= (red variant). Whereas less amount of green light in =#995500= +leads to a major drop in luminance relative to white. It follows that +using the green channel of light to calibrate the luminance of colors is +more effective than trying to do the same with either red or blue (the +latter is the least effective in that regard). + +When we need to work with several colors, it is always better to have +sufficient manoeuvring space, especially since we cannot pick arbitrary +colors but only those that satisfy the accessibility objectives of the +themes. + +As for why we do not mostly use green, yellow, cyan for the dark theme, +it is because those colors are far more luminant than their counterparts +on the other side of the spectrum, so to ensure that they all have about +the same contrast ratios we would have to alter their hueness +considerably. In short, the effect would not be optimal as it would +lead to exaggerations. Plus, it would make ~modus-vivendi~ look +completely different than ~modus-operandi~, to the effect that the two +could not be properly considered part of the same project. + +** What is the best setup for legibility? +:properties: +:custom_id: h:f60cc2ae-129d-47c0-9849-4f6bbd87d8be +:end: +#+cindex: General setup for readability + +The Modus themes can be conceptually simplified as combinations of color +values that account for relative luminance and inner harmony. Those +qualities do not guarantee that every end-user will have the same +experience, due to differences between people, but also because of +variances in hardware capabilities and configurations. For the purposes +of this document, we may only provide suggestions pertaining to the +latter case. + +~modus-operandi~ is best used outdoors or in a room that either gets +direct sunlight or has plenty of light. Whereas ~modus-vivendi~ works +better when there is not a lot of sunshine or the room has a source of +light that is preferably a faint and/or warm one. It is possible to use +~modus-operandi~ at night and ~modus-vivendi~ during the day, though that +will depend on several variables, such as one's overall perception of +color, the paint on the walls and how that contributes to the impression +of lightness in the room, the sense of space within the eye's peripheral +vision, hardware specifications, and environmental factors. + +In general, an additional source of light other than that of the monitor +can help reduce eye strain: the eyes are more relaxed when they do not +have to focus on one point to gather light. + +The monitor's display settings must be accounted for. Gamma values, in +particular, need to be calibrated to neither amplify nor distort the +perception of black. Same principle for sharpness, brightness, and +contrast as determined by the hardware, which all have an effect on how +text is read on the screen. + +There are software level methods on offer, such as the XrandR utility +for the X Window System (X.org), which can make gamma corrections for +each of the three channels of light (red, green, blue). For example: + +: xrandr --output LVDS1 --brightness 1.0 --gamma 0.76:0.75:0.68 + +Typography is another variable. Some font families are blurry at small +point sizes. Others may have a regular weight that is lighter (thiner) +than that of their peers which may, under certain circumstances, cause a +halo effect around each glyph. + +The gist is that legibility cannot be fully solved at the theme level. +The color combinations may have been optimized for accessibility, though +the remaining contributing factors in each case need to be considered in +full. + +** Are these color schemes? +:properties: +:custom_id: h:a956dbd3-8fd2-4f5d-8b01-5f881268cf2b +:end: +#+cindex: Themes, not color schemes + +No, the Modus themes are not color schemes. + +A color scheme is a collection of colors. A good color scheme is a +combination of colors with an inner logic or abstract structure. + +A theme is a set of patterns that are applied across different contexts. +A good theme is one that does so with consistency, though not +uniformity. + +In practical terms, a color scheme is what one uses when, for example, +they replace the first sixteen escape sequences of a terminal emulator +with color values of their preference. The terminal offers the option +to choose, say, the exact value of what counts as "red", but does not +provide the means to control where that is mapped to and whether it +should also have other qualities such as a bold weight for the +underlying text or an added background color. In contradistinction, +Emacs uses constructs known as "faces" which allow the user/developer +to specify where a given color will be used and whether it should be +accompanied by other typographic or stylistic attributes. + +By configuring the multitude of faces on offer we thus control both +which colors are applied and how they appear in their context. When a +package wants to render each instance of "foo" with the "bar" face, it +is not requesting a specific color, which makes things considerably more +flexible as we can treat "bar" in its own right without necessarily +having to use some color value that we hardcoded somewhere. + +Which brings us to the distinction between consistency and uniformity +where our goal is always the former: we want things to look similar +across all interfaces, but we must never force a visual identity where +that runs contrary to the functionality of the given interface. For +instance, all links are underlined by default yet there are cases such +as when viewing listings of emails in Gnus (and Mu4e, Notmuch) where (i) +it is already understood that one must follow the indicator or headline +to view its contents and (ii) underlining everything would make the +interface virtually unusable. + +Again, one must exercise judgement in order to avoid discrimination, +where "discrimination" refers to: + ++ The treatment of substantially different magnitudes as if they were of + the same class. ++ Or the treatment of the same class of magnitudes as if they were of a + different class. + +(To treat similar things differently; to treat dissimilar things alike.) + +If, in other words, one is to enforce uniformity without accounting +for the particular requirements of each case---the contextual demands +for usability beyond matters of color---they are making a +not-so-obvious error of treating different cases as if they were the +same. + +The Modus themes prioritize "thematic consistency" over abstract harmony +or regularity among their applicable colors. In concrete terms, we do +not claim that, say, our yellows are the best complements for our blues +because we generally avoid using complementary colors side-by-side, so +it is wrong to optimize for a decontextualised blue+yellow combination. +Not to imply that our colors do not work well together because they do, +just to clarify that consistency of context is what themes must strive +for, and that requires widening the scope of the design beyond the +particularities of a color scheme. + +Long story short: color schemes and themes have different requirements. +Please do not conflate the two. + +** Port the Modus themes to other platforms? +:properties: +:custom_id: h:7156b949-917d-488e-9a72-59f70d80729c +:end: +#+cindex: Porting the themes to other editors + +There is no plan to port the themes to other platforms or text editors. +I (Protesilaos) only use GNU Emacs and thus cannot maintain code that +targets software I am either not familiar with or am not using on a +daily basis. + +While it is possible to produce a simulacrum based on a given template, +doing so would run contrary to how this project is maintained where +details matter greatly. + +Each program has its own requirements so it won't always be +possible---or indeed desirable---to have 1:1 correspondence between +what applies to Emacs and what should be done elsewhere. No port +should ever strive to be a copy of the Emacs implementation, as no +other program is an Emacs equivalent, but instead try to follow the +spirit of the design. For example, some of the customization options +accept a list as their value, or an alist, which may not be possible +to reproduce on other platforms. + +[[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization options]]. + +In other words, if something must be done differently on a certain +editor then that is acceptable so long as (i) the accessibility +standards are not compromised and (ii) the overall character of the +themes remains consistent. + +The former criterion should be crystal clear as it pertains to the +scientific foundations of the themes: high legibility and taking care +of the needs of users with red-green/blue-yellow color deficiency +(deuteranopia and tritanopia) by avoiding red+green color coding +paradigms and/or by providing yellow+blue variants for deuteranopia +and red+cyan for tritanopia ([[#h:f0f3dbcb-602d-40cf-b918-8f929c441baf][Overview]]). + +The latter criterion is the "je ne sais quoi" of the artistic aspect of +the themes, which is partially fleshed out in this manual. + +[[#h:b3384767-30d3-4484-ba7f-081729f03a47][Frequently Asked Questions]]. + +With regard to the artistic aspect (where "art" qua skill may amount to +an imprecise science), there is no hard-and-fast rule in effect as it +requires one to exercize discretion and make decisions based on +context-dependent information or constraints. As is true with most +things in life, when in doubt, do not cling on to the letter of the law +but try to understand its spirit. + +For a trivial example: the curly underline that Emacs draws for spelling +errors is thinner than, e.g., what a graphical web browser has, so if I +was to design for an editor than has a thicker curly underline I would +make the applicable colors less intense to counterbalance the +typographic intensity of the added thickness. + +With those granted, if anyone is willing to develop a port of the +themes, they are welcome to contact me and I will do my best to help +them in their efforts. + +* Contributing +:properties: +:custom_id: h:9c3cd842-14b7-44d7-84b2-a5c8bc3fc3b1 +:end: + +This section documents the canonical sources of the themes and the ways +in which you can contribute to their ongoing development. + +** Sources of the themes +:properties: +:custom_id: h:89504f1c-c9a1-4bd9-ab39-78fd0eddb47c +:end: +#+cindex: Sources of the themes + ++ Package name (GNU ELPA): ~modus-themes~ ++ Official manual: <https://protesilaos.com/emacs/modus-themes> ++ Change log: <https://protesilaos.com/emacs/modus-themes-changelog> ++ Color palette: <https://protesilaos.com/emacs/modus-themes-colors> ++ Sample pictures: <https://protesilaos.com/emacs/modus-themes-pictures> ++ Git repo on SourceHut: <https://git.sr.ht/~protesilaos/modus-themes> + - Mirrors: + + GitHub: <https://github.com/protesilaos/modus-themes> + + GitLab: <https://gitlab.com/protesilaos/modus-themes> ++ Mailing list: <https://lists.sr.ht/~protesilaos/modus-themes> ++ Backronym: My Old Display Unexpectedly Sharpened ... themes + +** Issues you can help with +:properties: +:custom_id: h:6536c8d5-3f98-43ab-a787-b94120e735e8 +:end: +#+cindex: Contributing + +A few tasks you can help with by sending an email to the general +[[https://lists.sr.ht/~protesilaos/modus-themes][modus-themes public mailing list]]. + ++ Suggest refinements to packages that are covered. ++ Report packages not covered thus far. ++ Report bugs, inconsistencies, shortcomings. ++ Help expand the documentation of covered-but-not-styled packages. ++ Suggest refinements to the color palette. ++ Help expand this document or any other piece of documentation. ++ Send patches for code refinements (if you need, ask me for help with + Git---we all start out as beginners). + +[[#h:111773e2-f26f-4b68-8c4f-9794ca6b9633][Patches require copyright assignment to the FSF]]. + +It is preferable that your feedback includes some screenshots, GIFs, or +short videos, as well as further instructions to reproduce a given +setup. Though this is not a requirement. + +Whatever you do, bear in mind the overarching objective of the Modus +themes: to keep a contrast ratio that is greater or equal to 7:1 between +background and foreground colors. If a compromise is ever necessary +between aesthetics and accessibility, it shall always be made in the +interest of the latter. + +** Patches require copyright assignment to the FSF +:properties: +:custom_id: h:111773e2-f26f-4b68-8c4f-9794ca6b9633 +:end: + +Code contributions are most welcome. For any major edit (more than 15 +lines, or so, in aggregate per person), you need to make a copyright +assignment to the Free Software Foundation. This is necessary because +the themes are part of the upstream Emacs distribution: the FSF must at +all times be in a position to enforce the GNU General Public License. + +Copyright assignment is a simple process. Check the request form below +(please adapt it accordingly). You must write an email to the address +mentioned in the form and then wait for the FSF to send you a legal +agreement. Sign the document and file it back to them. This could all +happen via email and take about a week. You are encouraged to go +through this process. You only need to do it once. It will allow you +to make contributions to Emacs in general. + +#+begin_example text +Please email the following information to assign@gnu.org, and we +will send you the assignment form for your past and future changes. + +Please use your full legal name (in ASCII characters) as the subject +line of the message. + +REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES + +[What is the name of the program or package you're contributing to?] + +GNU Emacs + +[Did you copy any files or text written by someone else in these changes? +Even if that material is free software, we need to know about it.] + +Copied a few snippets from the same files I edited. Their author, +Protesilaos Stavrou, has already assigned copyright to the Free Software +Foundation. + +[Do you have an employer who might have a basis to claim to own +your changes? Do you attend a school which might make such a claim?] + + +[For the copyright registration, what country are you a citizen of?] + + +[What year were you born?] + + +[Please write your email address here.] + + +[Please write your postal address here.] + + + + + +[Which files have you changed so far, and which new files have you written +so far?] + +#+end_example + +* Acknowledgements +:properties: +:custom_id: h:95c3da23-217f-404e-b5f3-56c75760ebcf +:end: +#+cindex: Contributors + +The Modus themes are a collective effort. Every bit of work matters. + ++ Author/maintainer :: Protesilaos Stavrou. + ++ Contributions to code or documentation :: Aleksei Gusev, Alex + Griffin, Anders Johansson, Antonio Ruiz, Basil L.{{{space()}}} + Contovounesios, Björn Lindström, Carlo Zancanaro, Christian Tietze, + Daniel Mendler, David Edmondson, Eli Zaretskii, Fritz Grabo, Gautier + Ponsinet, Illia Ostapyshyn, Kévin Le Gouguec, Koen van Greevenbroek, + Kostadin Ninev, Madhavan Krishnan, Manuel Giraud, Markus Beppler, + Matthew Stevenson, Mauro Aranda, Nacho Barrientos, Nicolas De + Jaeghere, Paul David, Philip Kaludercic, Pierre Téchoueyres, Rudolf + Adamkovič, Sergey Nichiporchik, Shreyas Ragavan, Stefan Kangas, + Stephen Berman, Stephen Gildea, Steve Downey, Tomasz Hołubowicz, + Utkarsh Singh, Vincent Murphy, Xinglu Chen, Yuanchen Xie, fluentpwn, + okamsn. + ++ Ideas and user feedback :: Aaron Jensen, Adam Porter, Adam Spiers, + Adrian Manea, Aleksei Pirogov, Alex Griffin, Alex Koen, Alex + Peitsinis, Alexey Shmalko, Alok Singh, Anders Johansson, André + Alexandre Gomes, Andrew Tropin, Antonio Hernández Blas, Arif Rezai, + Augusto Stoffel, Basil L.{{{space()}}} Contovounesios, Bernd + Rellermeyer, Burgess Chang, Charlotte Van Petegem, Christian Tietze, + Christopher Dimech, Christopher League, Damien Cassou, Daniel + Mendler, Dario Gjorgjevski, David Edmondson, Davor Rotim, Divan + Santana, Eliraz Kedmi, Emanuele Michele Alberto Monterosso, Farasha + Euker, Feng Shu, Gautier Ponsinet, Gerry Agbobada, Gianluca Recchia, + Gonçalo Marrafa, Guilherme Semente, Gustavo Barros, Hörmetjan + Yiltiz, Ilja Kocken, Imran Khan, Iris Garcia, Ivan Popovych, James + Ferguson, Jeremy Friesen, Jerry Zhang, Johannes Grødem, John Haman, + Jonas Collberg, Jorge Morais, Joshua O'Connor, Julio C. Villasante, + Kenta Usami, Kevin Fleming, Kévin Le Gouguec, Kevin Kainan Li, + Kostadin Ninev, Laith Bahodi, Lasse Lindner, Len Trigg, Lennart + C. Karssen, Luis Miguel Castañeda, Magne Hov, Manuel Giraud, Manuel + Uberti, Mark Bestley, Mark Burton, Mark Simpson, Marko Kocic, Markus + Beppler, Matt Armstrong, Matthias Fuchs, Mattias Engdegård, Mauro + Aranda, Maxime Tréca, Michael Goldenberg, Morgan Smith, Morgan + Willcock, Murilo Pereira, Nicky van Foreest, Nicolas De Jaeghere, + Nicolas Semrau, Olaf Meeuwissen, Oliver Epper, Pablo Stafforini, + Paul Poloskov, Pengji Zhang, Pete Kazmier, Peter Wu, Philip + Kaludercic, Pierre Téchoueyres, Przemysław Kryger, Robert Hepple, + Roman Rudakov, Russell Sim, Ryan Phillips, Rytis Paškauskas, Rudolf + Adamkovič, Sam Kleinman, Samuel Culpepper, Saša Janiška, Shreyas + Ragavan, Simon Pugnet, Steve Downey, Tassilo Horn, Thanos Apollo, + Thibaut Verron, Thomas Heartman, Togan Muftuoglu, Tony Zorman, Trey + Merkley, Tomasz Hołubowicz, Toon Claes, Uri Sharf, Utkarsh Singh, + Vincent Foley, Zoltan Kiraly. As well as users: Ben, CsBigDataHub1, + Emacs Contrib, Eugene, Fourchaux, Fredrik, Moesasji, Nick, Summer + Emacs, TheBlob42, TitusMu, Trey, bepolymathe, bit9tream, + bangedorrunt, derek-upham, doolio, fleimgruber, gitrj95, iSeeU, + jixiuf, okamsn, pRot0ta1p, soaringbird, tumashu, wakamenod. + ++ Packaging :: Basil L.{{{space()}}} Contovounesios, Eli Zaretskii, + Glenn Morris, Mauro Aranda, Richard Stallman, Stefan Kangas (core + Emacs), Stefan Monnier (GNU Elpa), André Alexandre Gomes, Andrew + Tropin, Dimakakos Dimos, Morgan Smith, Nicolas Goaziou (Guix), Dhavan + Vaidya (Debian). + ++ Inspiration for certain features :: Bozhidar Batsov (zenburn-theme), + Fabrice Niessen (leuven-theme). + +Special thanks (from A-Z) to Daniel Mendler, Gustavo Barros, Manuel +Uberti, Nicolas De Jaeghere, and Omar Antolín Camarena for their long +time contributions and insightful commentary on key aspects of the +themes' design and/or aspects of their functionality. + +All errors are my own. + +* GNU Free Documentation License +:properties: +:appendix: t +:custom_id: h:3077c3d2-7f90-4228-8f0a-73124f4026f6 +:end: + +#+texinfo: @include doclicense.texi + +#+begin_export html +<pre> + + GNU Free Documentation License + Version 1.3, 3 November 2008 + + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + <https://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The "publisher" means any person or entity that distributes copies of +the Document to the public. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no +other conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to +give them a chance to provide you with an updated version of the +Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other +documents released under this License, and replace the individual +copies of this License in the various documents with a single copy +that is included in the collection, provided that you follow the rules +of this License for verbatim copying of each of the documents in all +other respects. + +You may extract a single document from such a collection, and +distribute it individually under this License, provided you insert a +copy of this License into the extracted document, and follow this +License in all other respects regarding verbatim copying of that +document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions of the +GNU Free Documentation License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. See +https://www.gnu.org/licenses/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +11. RELICENSING + +"Massive Multiauthor Collaboration Site" (or "MMC Site") means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +"Massive Multiauthor Collaboration" (or "MMC") contained in the site +means any set of copyrightable works thus published on the MMC site. + +"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +"Incorporate" means to publish or republish a Document, in whole or in +part, as part of another Document. + +An MMC is "eligible for relicensing" if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole or +in part into the MMC, (1) had no cover texts or invariant sections, and +(2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. +</pre> +#+end_export + +#+html: <!-- + +* Indices +:properties: +:custom_id: h:55104b26-8e94-46cf-9975-43ea00316489 +:end: + +** Function index +:properties: +:index: fn +:custom_id: h:6bec5005-529c-4521-ae05-3d990baffb5b +:end: + +** Variable index +:properties: +:index: vr +:custom_id: h:16ad8df6-b015-40a9-9259-03d4f7a23ee4 +:end: + +** Concept index +:properties: +:index: cp +:custom_id: h:6aa7a656-884b-4c39-b759-087e412eec13 +:end: + +#+html: --> diff --git a/elpa/modus-themes-4.3.0/modus-operandi-deuteranopia-theme.el b/elpa/modus-themes-4.3.0/modus-operandi-deuteranopia-theme.el @@ -0,0 +1,486 @@ +;;; modus-operandi-deuteranopia-theme.el --- Deuteranopia-optimized theme with a white background -*- lexical-binding:t -*- + +;; Copyright (C) 2019-2023 Free Software Foundation, Inc. + +;; Author: Protesilaos Stavrou <info@protesilaos.com> +;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> +;; URL: https://git.sr.ht/~protesilaos/modus-themes +;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes +;; Keywords: faces, theme, accessibility + +;; 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: +;; +;; The Modus themes conform with the highest standard for +;; color-contrast accessibility between background and foreground +;; values (WCAG AAA). Please refer to the official Info manual for +;; further documentation (distributed with the themes, or available +;; at: <https://protesilaos.com/emacs/modus-themes>). + +;;; Code: + + + +(eval-and-compile + (unless (and (fboundp 'require-theme) + load-file-name + (equal (file-name-directory load-file-name) + (expand-file-name "themes/" data-directory)) + (require-theme 'modus-themes t)) + (require 'modus-themes)) + +;;;###theme-autoload + (deftheme modus-operandi-deuteranopia + "Deuteranopia-optimized theme with a white background. +This variant is optimized for users with red-green color +deficiency (deuteranopia). It conforms with the highest +legibility standard for color contrast between background and +foreground in any given piece of text, which corresponds to a +minimum contrast in relative luminance of 7:1 (WCAG AAA +standard)." + :background-mode 'light + :kind 'color-scheme + :family 'modus) + + (defconst modus-operandi-deuteranopia-palette + '( +;;; Basic values + + (bg-main "#ffffff") + (bg-dim "#f2f2f2") + (fg-main "#000000") + (fg-dim "#595959") + (fg-alt "#193668") + (bg-active "#c4c4c4") + (bg-inactive "#e0e0e0") + (border "#9f9f9f") + +;;; Common accent foregrounds + + (red "#a60000") + (red-warmer "#972500") + (red-cooler "#a0132f") + (red-faint "#7f0000") + (red-intense "#d00000") + (green "#006800") + (green-warmer "#316500") + (green-cooler "#00663f") + (green-faint "#2a5045") + (green-intense "#008900") + (yellow "#695500") + (yellow-warmer "#973300") + (yellow-cooler "#77492f") + (yellow-faint "#624416") + (yellow-intense "#808000") + (blue "#0031a9") + (blue-warmer "#3548cf") + (blue-cooler "#0000b0") + (blue-faint "#003497") + (blue-intense "#0000ff") + (magenta "#721045") + (magenta-warmer "#8f0075") + (magenta-cooler "#531ab6") + (magenta-faint "#7c318f") + (magenta-intense "#dd22dd") + (cyan "#005e8b") + (cyan-warmer "#3f578f") + (cyan-cooler "#005f5f") + (cyan-faint "#005077") + (cyan-intense "#008899") + +;;; Uncommon accent foregrounds + + (rust "#8a290f") + (gold "#80601f") + (olive "#56692d") + (slate "#2f3f83") + (indigo "#4a3a8a") + (maroon "#731c52") + (pink "#7b435c") + +;;; Common accent backgrounds + + (bg-red-intense "#ff8f88") + (bg-green-intense "#8adf80") + (bg-yellow-intense "#f3d000") + (bg-blue-intense "#bfc9ff") + (bg-magenta-intense "#dfa0f0") + (bg-cyan-intense "#a4d5f9") + + (bg-red-subtle "#ffcfbf") + (bg-green-subtle "#b3fabf") + (bg-yellow-subtle "#fff576") + (bg-blue-subtle "#ccdfff") + (bg-magenta-subtle "#ffddff") + (bg-cyan-subtle "#bfefff") + + (bg-red-nuanced "#fff1f0") + (bg-green-nuanced "#ecf7ed") + (bg-yellow-nuanced "#fff3da") + (bg-blue-nuanced "#f3f3ff") + (bg-magenta-nuanced "#fdf0ff") + (bg-cyan-nuanced "#ebf6fa") + +;;; Uncommon accent backgrounds + + (bg-ochre "#f0e0cc") + (bg-lavender "#dfdbfa") + (bg-sage "#c0e7d4") + +;;; Graphs + + (bg-graph-red-0 "#d0b029") + (bg-graph-red-1 "#e0cab4") + (bg-graph-green-0 "#8ad080") + (bg-graph-green-1 "#afdfa5") + (bg-graph-yellow-0 "#ffcf00") + (bg-graph-yellow-1 "#f9ff00") + (bg-graph-blue-0 "#7f9fff") + (bg-graph-blue-1 "#9fc6ff") + (bg-graph-magenta-0 "#b0b0d0") + (bg-graph-magenta-1 "#d0dfdf") + (bg-graph-cyan-0 "#6faad9") + (bg-graph-cyan-1 "#bfe0ff") + +;;; Special purpose + + (bg-completion "#c0deff") + (bg-hover "#b2e4dc") + (bg-hover-secondary "#f5d0a0") + (bg-hl-line "#dae5ec") + (bg-region "#bdbdbd") + (fg-region "#000000") + + (bg-char-0 "#7feaff") + (bg-char-1 "#ffaaff") + (bg-char-2 "#dff000") + + (bg-mode-line-active "#d0d6ff") + (fg-mode-line-active "#0f0f0f") + (border-mode-line-active "#4f4f74") + (bg-mode-line-inactive "#e6e6e6") + (fg-mode-line-inactive "#585858") + (border-mode-line-inactive "#a3a3a3") + + (modeline-err "#603a00") + (modeline-warning "#454500") + (modeline-info "#023d92") + + (bg-tab-bar "#dfdfdf") + (bg-tab-current "#ffffff") + (bg-tab-other "#c2c2c2") + +;;; Diffs + + (bg-added "#d5d7ff") + (bg-added-faint "#e6e6ff") + (bg-added-refine "#babcef") + (bg-added-fringe "#275acc") + (fg-added "#303099") + (fg-added-intense "#0303cc") + + (bg-changed "#eecfdf") + (bg-changed-faint "#f0dde5") + (bg-changed-refine "#e0b0d0") + (bg-changed-fringe "#9f6ab0") + (fg-changed "#6f1343") + (fg-changed-intense "#7f0f9f") + + (bg-removed "#f4f099") + (bg-removed-faint "#f6f6b7") + (bg-removed-refine "#ede06f") + (bg-removed-fringe "#c0b200") + (fg-removed "#553d00") + (fg-removed-intense "#7f6f00") + + (bg-diff-context "#f3f3f3") + +;;; Paren match + + (bg-paren-match "#5fcfff") + (bg-paren-expression "#efd3f5") + (underline-paren-match unspecified) + +;;; Mappings + +;;;; General mappings + + (fringe bg-dim) + (cursor blue-intense) + + (keybind blue-cooler) + (name blue-cooler) + (identifier yellow-faint) + + (err yellow-warmer) + (warning yellow) + (info blue) + + (underline-err yellow-intense) + (underline-warning magenta-faint) + (underline-note cyan) + + (bg-prominent-err bg-yellow-intense) + (fg-prominent-err fg-main) + (bg-prominent-warning bg-magenta-intense) + (fg-prominent-warning fg-main) + (bg-prominent-note bg-cyan-intense) + (fg-prominent-note fg-main) + +;;;; Code mappings + + (builtin magenta-warmer) + (comment yellow-cooler) + (constant blue-cooler) + (docstring green-faint) + (docmarkup magenta-faint) + (fnname magenta) + (keyword magenta-cooler) + (preprocessor red-cooler) + (string blue-warmer) + (type cyan-cooler) + (variable cyan) + (rx-construct yellow-cooler) + (rx-backslash blue-cooler) + +;;;; Accent mappings + + (accent-0 blue) + (accent-1 yellow-warmer) + (accent-2 cyan) + (accent-3 magenta-cooler) + +;;;; Button mappings + + (fg-button-active fg-main) + (fg-button-inactive fg-dim) + (bg-button-active bg-active) + (bg-button-inactive bg-dim) + +;;;; Completion mappings + + (fg-completion-match-0 blue) + (fg-completion-match-1 yellow-warmer) + (fg-completion-match-2 cyan) + (fg-completion-match-3 magenta-cooler) + (bg-completion-match-0 unspecified) + (bg-completion-match-1 unspecified) + (bg-completion-match-2 unspecified) + (bg-completion-match-3 unspecified) + +;;;; Date mappings + + (date-common cyan) + (date-deadline yellow-warmer) + (date-event fg-alt) + (date-holiday yellow-warmer) + (date-holiday-other blue) + (date-now blue-faint) + (date-range fg-alt) + (date-scheduled yellow-cooler) + (date-weekday cyan) + (date-weekend yellow-faint) + +;;;; Line number mappings + + (fg-line-number-inactive fg-dim) + (fg-line-number-active fg-main) + (bg-line-number-inactive bg-dim) + (bg-line-number-active bg-active) + +;;;; Link mappings + + (fg-link blue-warmer) + (bg-link unspecified) + (underline-link blue-warmer) + + (fg-link-symbolic cyan) + (bg-link-symbolic unspecified) + (underline-link-symbolic cyan) + + (fg-link-visited yellow-faint) + (bg-link-visited unspecified) + (underline-link-visited yellow-faint) + +;;;; Mail mappings + + (mail-cite-0 blue-warmer) + (mail-cite-1 yellow) + (mail-cite-2 cyan-faint) + (mail-cite-3 yellow-faint) + (mail-part blue) + (mail-recipient blue) + (mail-subject yellow-cooler) + (mail-other cyan-faint) + +;;;; Mark mappings + + (bg-mark-delete bg-yellow-subtle) + (fg-mark-delete yellow) + (bg-mark-select bg-cyan-subtle) + (fg-mark-select cyan) + (bg-mark-other bg-magenta-subtle) + (fg-mark-other magenta) + +;;;; Prompt mappings + + (fg-prompt blue) + (bg-prompt unspecified) + +;;;; Prose mappings + + (prose-block fg-dim) + (prose-code cyan-cooler) + (prose-done blue) + (prose-macro magenta-cooler) + (prose-metadata fg-dim) + (prose-metadata-value fg-alt) + (prose-table fg-alt) + (prose-tag magenta-faint) + (prose-todo yellow-warmer) + (prose-verbatim magenta-warmer) + +;;;; Rainbow mappings + + (rainbow-0 blue) + (rainbow-1 yellow) + (rainbow-2 blue-warmer) + (rainbow-3 yellow-cooler) + (rainbow-4 blue-cooler) + (rainbow-5 yellow-warmer) + (rainbow-6 blue-faint) + (rainbow-7 yellow-faint) + (rainbow-8 cyan) + +;;;; Space mappings + + (bg-space unspecified) + (fg-space border) + (bg-space-err bg-yellow-intense) + +;;;; Terminal mappings + + (bg-term-black "black") + (fg-term-black "black") + (bg-term-black-bright "gray35") + (fg-term-black-bright "gray35") + + (bg-term-red red) + (fg-term-red red) + (bg-term-red-bright red-warmer) + (fg-term-red-bright red-warmer) + + (bg-term-green green) + (fg-term-green green) + (bg-term-green-bright green-cooler) + (fg-term-green-bright green-cooler) + + (bg-term-yellow yellow) + (fg-term-yellow yellow) + (bg-term-yellow-bright yellow-warmer) + (fg-term-yellow-bright yellow-warmer) + + (bg-term-blue blue) + (fg-term-blue blue) + (bg-term-blue-bright blue-warmer) + (fg-term-blue-bright blue-warmer) + + (bg-term-magenta magenta) + (fg-term-magenta magenta) + (bg-term-magenta-bright magenta-cooler) + (fg-term-magenta-bright magenta-cooler) + + (bg-term-cyan cyan) + (fg-term-cyan cyan) + (bg-term-cyan-bright cyan-cooler) + (fg-term-cyan-bright cyan-cooler) + + (bg-term-white "gray65") + (fg-term-white "gray65") + (bg-term-white-bright "white") + (fg-term-white-bright "white") + +;;;; Heading mappings + + (fg-heading-0 cyan-cooler) + (fg-heading-1 fg-main) + (fg-heading-2 yellow-faint) + (fg-heading-3 fg-alt) + (fg-heading-4 magenta) + (fg-heading-5 green-faint) + (fg-heading-6 red-faint) + (fg-heading-7 cyan-warmer) + (fg-heading-8 fg-dim) + + (bg-heading-0 unspecified) + (bg-heading-1 unspecified) + (bg-heading-2 unspecified) + (bg-heading-3 unspecified) + (bg-heading-4 unspecified) + (bg-heading-5 unspecified) + (bg-heading-6 unspecified) + (bg-heading-7 unspecified) + (bg-heading-8 unspecified) + + (overline-heading-0 unspecified) + (overline-heading-1 unspecified) + (overline-heading-2 unspecified) + (overline-heading-3 unspecified) + (overline-heading-4 unspecified) + (overline-heading-5 unspecified) + (overline-heading-6 unspecified) + (overline-heading-7 unspecified) + (overline-heading-8 unspecified)) + "The entire palette of the `modus-operandi-deuteranopia' theme. + +Named colors have the form (COLOR-NAME HEX-VALUE) with the former +as a symbol and the latter as a string. + +Semantic color mappings have the form (MAPPING-NAME COLOR-NAME) +with both as symbols. The latter is a named color that already +exists in the palette and is associated with a HEX-VALUE.") + + (defcustom modus-operandi-deuteranopia-palette-overrides nil + "Overrides for `modus-operandi-deuteranopia-palette'. + +Mirror the elements of the aforementioned palette, overriding +their value. + +For overrides that are shared across all of the Modus themes, +refer to `modus-themes-common-palette-overrides'. + +Theme-specific overrides take precedence over shared overrides. +The idea of common overrides is to change semantic color +mappings, such as to make the cursor red. Wherea theme-specific +overrides can also be used to change the value of a named color, +such as what hexadecimal RGB value the red-warmer symbol +represents." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type '(repeat (list symbol (choice symbol string))) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Palette overrides")) + + (modus-themes-theme modus-operandi-deuteranopia + modus-operandi-deuteranopia-palette + modus-operandi-deuteranopia-palette-overrides) + + (provide-theme 'modus-operandi-deuteranopia)) + +;;; modus-operandi-deuteranopia-theme.el ends here diff --git a/elpa/modus-themes-4.3.0/modus-operandi-theme.el b/elpa/modus-themes-4.3.0/modus-operandi-theme.el @@ -0,0 +1,484 @@ +;;; modus-operandi-theme.el --- Elegant, highly legible theme with a white background -*- lexical-binding:t -*- + +;; Copyright (C) 2019-2023 Free Software Foundation, Inc. + +;; Author: Protesilaos Stavrou <info@protesilaos.com> +;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> +;; URL: https://git.sr.ht/~protesilaos/modus-themes +;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes +;; Keywords: faces, theme, accessibility + +;; 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: +;; +;; The Modus themes conform with the highest standard for +;; color-contrast accessibility between background and foreground +;; values (WCAG AAA). Please refer to the official Info manual for +;; further documentation (distributed with the themes, or available +;; at: <https://protesilaos.com/emacs/modus-themes>). + +;;; Code: + + + +(eval-and-compile + (unless (and (fboundp 'require-theme) + load-file-name + (equal (file-name-directory load-file-name) + (expand-file-name "themes/" data-directory)) + (require-theme 'modus-themes t)) + (require 'modus-themes)) + +;;;###theme-autoload + (deftheme modus-operandi + "Elegant, highly legible theme with a white background. +Conforms with the highest legibility standard for color contrast +between background and foreground in any given piece of text, +which corresponds to a minimum contrast in relative luminance of +7:1 (WCAG AAA standard)." + :background-mode 'light + :kind 'color-scheme + :family 'modus) + + (defconst modus-operandi-palette + '( +;;; Basic values + + (bg-main "#ffffff") + (bg-dim "#f2f2f2") + (fg-main "#000000") + (fg-dim "#595959") + (fg-alt "#193668") + (bg-active "#c4c4c4") + (bg-inactive "#e0e0e0") + (border "#9f9f9f") + +;;; Common accent foregrounds + + (red "#a60000") + (red-warmer "#972500") + (red-cooler "#a0132f") + (red-faint "#7f0000") + (red-intense "#d00000") + (green "#006800") + (green-warmer "#316500") + (green-cooler "#00663f") + (green-faint "#2a5045") + (green-intense "#008900") + (yellow "#6f5500") + (yellow-warmer "#884900") + (yellow-cooler "#7a4f2f") + (yellow-faint "#624416") + (yellow-intense "#808000") + (blue "#0031a9") + (blue-warmer "#3548cf") + (blue-cooler "#0000b0") + (blue-faint "#003497") + (blue-intense "#0000ff") + (magenta "#721045") + (magenta-warmer "#8f0075") + (magenta-cooler "#531ab6") + (magenta-faint "#7c318f") + (magenta-intense "#dd22dd") + (cyan "#005e8b") + (cyan-warmer "#3f578f") + (cyan-cooler "#005f5f") + (cyan-faint "#005077") + (cyan-intense "#008899") + +;;; Uncommon accent foregrounds + + (rust "#8a290f") + (gold "#80601f") + (olive "#56692d") + (slate "#2f3f83") + (indigo "#4a3a8a") + (maroon "#731c52") + (pink "#7b435c") + +;;; Common accent backgrounds + + (bg-red-intense "#ff8f88") + (bg-green-intense "#8adf80") + (bg-yellow-intense "#f3d000") + (bg-blue-intense "#bfc9ff") + (bg-magenta-intense "#dfa0f0") + (bg-cyan-intense "#a4d5f9") + + (bg-red-subtle "#ffcfbf") + (bg-green-subtle "#b3fabf") + (bg-yellow-subtle "#fff576") + (bg-blue-subtle "#ccdfff") + (bg-magenta-subtle "#ffddff") + (bg-cyan-subtle "#bfefff") + + (bg-red-nuanced "#fff1f0") + (bg-green-nuanced "#ecf7ed") + (bg-yellow-nuanced "#fff3da") + (bg-blue-nuanced "#f3f3ff") + (bg-magenta-nuanced "#fdf0ff") + (bg-cyan-nuanced "#ebf6fa") + +;;; Uncommon accent backgrounds + + (bg-ochre "#f0e0cc") + (bg-lavender "#dfdbfa") + (bg-sage "#c0e7d4") + +;;; Graphs + + (bg-graph-red-0 "#ef7969") + (bg-graph-red-1 "#ffaab4") + (bg-graph-green-0 "#2fe029") + (bg-graph-green-1 "#75ef30") + (bg-graph-yellow-0 "#ffcf00") + (bg-graph-yellow-1 "#f9ff00") + (bg-graph-blue-0 "#7f90ff") + (bg-graph-blue-1 "#9fc6ff") + (bg-graph-magenta-0 "#e07fff") + (bg-graph-magenta-1 "#fad0ff") + (bg-graph-cyan-0 "#70d3f0") + (bg-graph-cyan-1 "#afefff") + +;;; Special purpose + + (bg-completion "#c0deff") + (bg-hover "#b2e4dc") + (bg-hover-secondary "#f5d0a0") + (bg-hl-line "#dae5ec") + (bg-region "#bdbdbd") + (fg-region "#000000") + + (bg-char-0 "#7feaff") + (bg-char-1 "#ffaaff") + (bg-char-2 "#dff000") + + (bg-mode-line-active "#c8c8c8") + (fg-mode-line-active "#000000") + (border-mode-line-active "#5a5a5a") + (bg-mode-line-inactive "#e6e6e6") + (fg-mode-line-inactive "#585858") + (border-mode-line-inactive "#a3a3a3") + + (modeline-err "#7f0000") + (modeline-warning "#5f0070") + (modeline-info "#002580") + + (bg-tab-bar "#dfdfdf") + (bg-tab-current "#ffffff") + (bg-tab-other "#c2c2c2") + +;;; Diffs + + (bg-added "#c1f2d1") + (bg-added-faint "#d8f8e1") + (bg-added-refine "#aee5be") + (bg-added-fringe "#6cc06c") + (fg-added "#005000") + (fg-added-intense "#006700") + + (bg-changed "#ffdfa9") + (bg-changed-faint "#ffefbf") + (bg-changed-refine "#fac090") + (bg-changed-fringe "#d7c20a") + (fg-changed "#553d00") + (fg-changed-intense "#655000") + + (bg-removed "#ffd8d5") + (bg-removed-faint "#ffe9e9") + (bg-removed-refine "#f3b5af") + (bg-removed-fringe "#d84a4f") + (fg-removed "#8f1313") + (fg-removed-intense "#aa2222") + + (bg-diff-context "#f3f3f3") + +;;; Paren match + + (bg-paren-match "#5fcfff") + (bg-paren-expression "#efd3f5") + (underline-paren-match unspecified) + +;;; Mappings + +;;;; General mappings + + (fringe bg-dim) + (cursor fg-main) + + (keybind blue-cooler) + (name magenta) + (identifier yellow-cooler) + + (err red) + (warning yellow-warmer) + (info cyan-cooler) + + (underline-err red-intense) + (underline-warning yellow-intense) + (underline-note cyan-intense) + + (bg-prominent-err bg-red-intense) + (fg-prominent-err fg-main) + (bg-prominent-warning bg-yellow-intense) + (fg-prominent-warning fg-main) + (bg-prominent-note bg-cyan-intense) + (fg-prominent-note fg-main) + +;;;; Code mappings + + (builtin magenta-warmer) + (comment fg-dim) + (constant blue-cooler) + (docstring green-faint) + (docmarkup magenta-faint) + (fnname magenta) + (keyword magenta-cooler) + (preprocessor red-cooler) + (string blue-warmer) + (type cyan-cooler) + (variable cyan) + (rx-construct green-cooler) + (rx-backslash magenta) + +;;;; Accent mappings + + (accent-0 blue) + (accent-1 magenta-warmer) + (accent-2 cyan) + (accent-3 red) + +;;;; Button mappings + + (fg-button-active fg-main) + (fg-button-inactive fg-dim) + (bg-button-active bg-active) + (bg-button-inactive bg-dim) + +;;;; Completion mappings + + (fg-completion-match-0 blue) + (fg-completion-match-1 magenta-warmer) + (fg-completion-match-2 cyan) + (fg-completion-match-3 red) + (bg-completion-match-0 unspecified) + (bg-completion-match-1 unspecified) + (bg-completion-match-2 unspecified) + (bg-completion-match-3 unspecified) + +;;;; Date mappings + + (date-common cyan) + (date-deadline red) + (date-event fg-alt) + (date-holiday red-cooler) + (date-holiday-other blue) + (date-now fg-main) + (date-range fg-alt) + (date-scheduled yellow-warmer) + (date-weekday cyan) + (date-weekend red-faint) + +;;;; Line number mappings + + (fg-line-number-inactive fg-dim) + (fg-line-number-active fg-main) + (bg-line-number-inactive bg-dim) + (bg-line-number-active bg-active) + +;;;; Link mappings + + (fg-link blue-warmer) + (bg-link unspecified) + (underline-link blue-warmer) + + (fg-link-symbolic cyan) + (bg-link-symbolic unspecified) + (underline-link-symbolic cyan) + + (fg-link-visited magenta) + (bg-link-visited unspecified) + (underline-link-visited magenta) + +;;;; Mail mappings + + (mail-cite-0 blue-faint) + (mail-cite-1 yellow-warmer) + (mail-cite-2 cyan-cooler) + (mail-cite-3 red-cooler) + (mail-part cyan) + (mail-recipient magenta-cooler) + (mail-subject magenta-warmer) + (mail-other magenta-faint) + +;;;; Mark mappings + + (bg-mark-delete bg-red-subtle) + (fg-mark-delete red) + (bg-mark-select bg-cyan-subtle) + (fg-mark-select cyan) + (bg-mark-other bg-yellow-subtle) + (fg-mark-other yellow) + +;;;; Prompt mappings + + (fg-prompt cyan-cooler) + (bg-prompt unspecified) + +;;;; Prose mappings + + (prose-block fg-dim) + (prose-code green-cooler) + (prose-done green) + (prose-macro magenta-cooler) + (prose-metadata fg-dim) + (prose-metadata-value fg-alt) + (prose-table fg-alt) + (prose-tag magenta-faint) + (prose-todo red) + (prose-verbatim magenta-warmer) + +;;;; Rainbow mappings + + (rainbow-0 fg-main) + (rainbow-1 magenta-intense) + (rainbow-2 cyan-intense) + (rainbow-3 red-warmer) + (rainbow-4 yellow-intense) + (rainbow-5 magenta-cooler) + (rainbow-6 green-intense) + (rainbow-7 blue-warmer) + (rainbow-8 magenta-warmer) + +;;;; Space mappings + + (bg-space unspecified) + (fg-space border) + (bg-space-err bg-red-intense) + +;;;; Terminal mappings + + (bg-term-black "black") + (fg-term-black "black") + (bg-term-black-bright "gray35") + (fg-term-black-bright "gray35") + + (bg-term-red red) + (fg-term-red red) + (bg-term-red-bright red-warmer) + (fg-term-red-bright red-warmer) + + (bg-term-green green) + (fg-term-green green) + (bg-term-green-bright green-cooler) + (fg-term-green-bright green-cooler) + + (bg-term-yellow yellow) + (fg-term-yellow yellow) + (bg-term-yellow-bright yellow-warmer) + (fg-term-yellow-bright yellow-warmer) + + (bg-term-blue blue) + (fg-term-blue blue) + (bg-term-blue-bright blue-warmer) + (fg-term-blue-bright blue-warmer) + + (bg-term-magenta magenta) + (fg-term-magenta magenta) + (bg-term-magenta-bright magenta-cooler) + (fg-term-magenta-bright magenta-cooler) + + (bg-term-cyan cyan) + (fg-term-cyan cyan) + (bg-term-cyan-bright cyan-cooler) + (fg-term-cyan-bright cyan-cooler) + + (bg-term-white "gray65") + (fg-term-white "gray65") + (bg-term-white-bright "white") + (fg-term-white-bright "white") + +;;;; Heading mappings + + (fg-heading-0 cyan-cooler) + (fg-heading-1 fg-main) + (fg-heading-2 yellow-faint) + (fg-heading-3 fg-alt) + (fg-heading-4 magenta) + (fg-heading-5 green-faint) + (fg-heading-6 red-faint) + (fg-heading-7 cyan-warmer) + (fg-heading-8 fg-dim) + + (bg-heading-0 unspecified) + (bg-heading-1 unspecified) + (bg-heading-2 unspecified) + (bg-heading-3 unspecified) + (bg-heading-4 unspecified) + (bg-heading-5 unspecified) + (bg-heading-6 unspecified) + (bg-heading-7 unspecified) + (bg-heading-8 unspecified) + + (overline-heading-0 unspecified) + (overline-heading-1 unspecified) + (overline-heading-2 unspecified) + (overline-heading-3 unspecified) + (overline-heading-4 unspecified) + (overline-heading-5 unspecified) + (overline-heading-6 unspecified) + (overline-heading-7 unspecified) + (overline-heading-8 unspecified)) + "The entire palette of the `modus-operandi' theme. + +Named colors have the form (COLOR-NAME HEX-VALUE) with the former +as a symbol and the latter as a string. + +Semantic color mappings have the form (MAPPING-NAME COLOR-NAME) +with both as symbols. The latter is a named color that already +exists in the palette and is associated with a HEX-VALUE.") + + (defcustom modus-operandi-palette-overrides nil + "Overrides for `modus-operandi-palette'. + +Mirror the elements of the aforementioned palette, overriding +their value. + +For overrides that are shared across all of the Modus themes, +refer to `modus-themes-common-palette-overrides'. + +Theme-specific overrides take precedence over shared overrides. +The idea of common overrides is to change semantic color +mappings, such as to make the cursor red. Wherea theme-specific +overrides can also be used to change the value of a named color, +such as what hexadecimal RGB value the red-warmer symbol +represents." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type '(repeat (list symbol (choice symbol string))) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Palette overrides")) + + (modus-themes-theme modus-operandi + modus-operandi-palette + modus-operandi-palette-overrides) + + (provide-theme 'modus-operandi)) + +;;; modus-operandi-theme.el ends here diff --git a/elpa/modus-themes-4.3.0/modus-operandi-tinted-theme.el b/elpa/modus-themes-4.3.0/modus-operandi-tinted-theme.el @@ -0,0 +1,483 @@ +;;; modus-operandi-tinted-theme.el --- Elegant, highly legible theme with a light ochre background -*- lexical-binding:t -*- + +;; Copyright (C) 2019-2023 Free Software Foundation, Inc. + +;; Author: Protesilaos Stavrou <info@protesilaos.com> +;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> +;; URL: https://git.sr.ht/~protesilaos/modus-themes +;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes + +;; 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: +;; +;; The Modus themes conform with the highest standard for +;; color-contrast accessibility between background and foreground +;; values (WCAG AAA). Please refer to the official Info manual for +;; further documentation (distributed with the themes, or available +;; at: <https://protesilaos.com/emacs/modus-themes>). + +;;; Code: + + + +(eval-and-compile + (unless (and (fboundp 'require-theme) + load-file-name + (equal (file-name-directory load-file-name) + (expand-file-name "themes/" data-directory)) + (require-theme 'modus-themes t)) + (require 'modus-themes)) + +;;;###theme-autoload + (deftheme modus-operandi-tinted + "Elegant, highly legible theme with a light ochre background. +Conforms with the highest legibility standard for color contrast +between background and foreground in any given piece of text, +which corresponds to a minimum contrast in relative luminance of +7:1 (WCAG AAA standard)." + :background-mode 'light + :kind 'color-scheme + :family 'modus) + + (defconst modus-operandi-tinted-palette + '( +;;; Basic values + + (bg-main "#fbf7f0") + (bg-dim "#efe9dd") + (fg-main "#000000") + (fg-dim "#595959") + (fg-alt "#193668") + (bg-active "#c9b9b0") + (bg-inactive "#dfd5cf") + (border "#9f9690") + +;;; Common accent foregrounds + + (red "#a60000") + (red-warmer "#972500") + (red-cooler "#a0132f") + (red-faint "#7f0000") + (red-intense "#d00000") + (green "#006800") + (green-warmer "#316500") + (green-cooler "#00663f") + (green-faint "#2a5045") + (green-intense "#008900") + (yellow "#6f5500") + (yellow-warmer "#884900") + (yellow-cooler "#7a4f2f") + (yellow-faint "#624416") + (yellow-intense "#808000") + (blue "#0031a9") + (blue-warmer "#3548cf") + (blue-cooler "#0000b0") + (blue-faint "#003497") + (blue-intense "#0000ff") + (magenta "#721045") + (magenta-warmer "#8f0075") + (magenta-cooler "#531ab6") + (magenta-faint "#7c318f") + (magenta-intense "#dd22dd") + (cyan "#005e8b") + (cyan-warmer "#3f578f") + (cyan-cooler "#005f5f") + (cyan-faint "#005077") + (cyan-intense "#008899") + +;;; Uncommon accent foregrounds + + (rust "#8a290f") + (gold "#80601f") + (olive "#56692d") + (slate "#2f3f83") + (indigo "#4a3a8a") + (maroon "#731c52") + (pink "#7b435c") + +;;; Common accent backgrounds + + (bg-red-intense "#ff8f88") + (bg-green-intense "#8adf80") + (bg-yellow-intense "#f3d000") + (bg-blue-intense "#bfc9ff") + (bg-magenta-intense "#dfa0f0") + (bg-cyan-intense "#a4d5f9") + + (bg-red-subtle "#ffcfbf") + (bg-green-subtle "#b3fabf") + (bg-yellow-subtle "#fff576") + (bg-blue-subtle "#ccdfff") + (bg-magenta-subtle "#ffddff") + (bg-cyan-subtle "#bfefff") + + (bg-red-nuanced "#ffe8f0") + (bg-green-nuanced "#e0f5e0") + (bg-yellow-nuanced "#f9ead0") + (bg-blue-nuanced "#ebebff") + (bg-magenta-nuanced "#f6e7ff") + (bg-cyan-nuanced "#e1f3fc") + +;;; Uncommon accent backgrounds + + (bg-ochre "#f0e0cc") + (bg-lavender "#dfdbfa") + (bg-sage "#c0e7d4") + +;;; Graphs + + (bg-graph-red-0 "#ef7969") + (bg-graph-red-1 "#ffaab4") + (bg-graph-green-0 "#2fe029") + (bg-graph-green-1 "#75ef30") + (bg-graph-yellow-0 "#ffcf00") + (bg-graph-yellow-1 "#f9ff00") + (bg-graph-blue-0 "#7f90ff") + (bg-graph-blue-1 "#9fc6ff") + (bg-graph-magenta-0 "#e07fff") + (bg-graph-magenta-1 "#fad0ff") + (bg-graph-cyan-0 "#70d3f0") + (bg-graph-cyan-1 "#afefff") + +;;; Special purpose + + (bg-completion "#f0c1cf") + (bg-hover "#b2e4dc") + (bg-hover-secondary "#f5d0a0") + (bg-hl-line "#f1d5d0") + (bg-region "#c2bcb5") + (fg-region "#000000") + + (bg-char-0 "#7feaff") + (bg-char-1 "#ffaaff") + (bg-char-2 "#dff000") + + (bg-mode-line-active "#cab9b2") + (fg-mode-line-active "#000000") + (border-mode-line-active "#545454") + (bg-mode-line-inactive "#dfd9cf") + (fg-mode-line-inactive "#585858") + (border-mode-line-inactive "#a59a94") + + (modeline-err "#7f0000") + (modeline-warning "#5f0070") + (modeline-info "#002580") + + (bg-tab-bar "#e0d4ce") + (bg-tab-current "#fbf7f0") + (bg-tab-other "#c8b8b2") + +;;; Diffs + + (bg-added "#c3ebc1") + (bg-added-faint "#dcf8d1") + (bg-added-refine "#acd6a5") + (bg-added-fringe "#6cc06c") + (fg-added "#005000") + (fg-added-intense "#006700") + + (bg-changed "#ffdfa9") + (bg-changed-faint "#ffefbf") + (bg-changed-refine "#fac090") + (bg-changed-fringe "#c0b200") + (fg-changed "#553d00") + (fg-changed-intense "#655000") + + (bg-removed "#f4d0cf") + (bg-removed-faint "#ffe9e5") + (bg-removed-refine "#f3b5a7") + (bg-removed-fringe "#d84a4f") + (fg-removed "#8f1313") + (fg-removed-intense "#aa2222") + + (bg-diff-context "#efe9df") + +;;; Paren match + + (bg-paren-match "#7fdfcf") + (bg-paren-expression "#efd3f5") + (underline-paren-match unspecified) + +;;; Mappings + +;;;; General mappings + + (fringe bg-dim) + (cursor red) + + (keybind blue-cooler) + (name magenta) + (identifier yellow-cooler) + + (err red) + (warning yellow-warmer) + (info cyan-cooler) + + (underline-err red-intense) + (underline-warning yellow-intense) + (underline-note cyan-intense) + + (bg-prominent-err bg-red-intense) + (fg-prominent-err fg-main) + (bg-prominent-warning bg-yellow-intense) + (fg-prominent-warning fg-main) + (bg-prominent-note bg-cyan-intense) + (fg-prominent-note fg-main) + +;;;; Code mappings + + (builtin magenta-warmer) + (comment red-faint) + (constant blue-cooler) + (docstring green-faint) + (docmarkup magenta-faint) + (fnname magenta) + (keyword magenta-cooler) + (preprocessor red-cooler) + (string blue-warmer) + (type cyan-cooler) + (variable cyan) + (rx-construct green-cooler) + (rx-backslash magenta) + +;;;; Accent mappings + + (accent-0 blue) + (accent-1 magenta-warmer) + (accent-2 cyan) + (accent-3 red) + +;;;; Button mappings + + (fg-button-active fg-main) + (fg-button-inactive fg-dim) + (bg-button-active bg-active) + (bg-button-inactive bg-dim) + +;;;; Completion mappings + + (fg-completion-match-0 blue) + (fg-completion-match-1 magenta-warmer) + (fg-completion-match-2 cyan) + (fg-completion-match-3 red) + (bg-completion-match-0 unspecified) + (bg-completion-match-1 unspecified) + (bg-completion-match-2 unspecified) + (bg-completion-match-3 unspecified) + +;;;; Date mappings + + (date-common cyan) + (date-deadline red) + (date-event fg-alt) + (date-holiday red-cooler) + (date-holiday-other blue) + (date-now fg-main) + (date-range fg-alt) + (date-scheduled yellow-warmer) + (date-weekday cyan) + (date-weekend red-faint) + +;;;; Line number mappings + + (fg-line-number-inactive fg-dim) + (fg-line-number-active fg-main) + (bg-line-number-inactive bg-dim) + (bg-line-number-active bg-active) + +;;;; Link mappings + + (fg-link blue-warmer) + (bg-link unspecified) + (underline-link blue-warmer) + + (fg-link-symbolic cyan) + (bg-link-symbolic unspecified) + (underline-link-symbolic cyan) + + (fg-link-visited magenta) + (bg-link-visited unspecified) + (underline-link-visited magenta) + +;;;; Mail mappings + + (mail-cite-0 blue-faint) + (mail-cite-1 yellow-warmer) + (mail-cite-2 cyan-cooler) + (mail-cite-3 red-cooler) + (mail-part cyan) + (mail-recipient magenta-cooler) + (mail-subject magenta-warmer) + (mail-other magenta-faint) + +;;;; Mark mappings + + (bg-mark-delete bg-red-subtle) + (fg-mark-delete red) + (bg-mark-select bg-cyan-subtle) + (fg-mark-select cyan) + (bg-mark-other bg-yellow-subtle) + (fg-mark-other yellow) + +;;;; Prompt mappings + + (fg-prompt cyan-cooler) + (bg-prompt unspecified) + +;;;; Prose mappings + + (prose-block fg-dim) + (prose-code green-cooler) + (prose-done green) + (prose-macro magenta-cooler) + (prose-metadata fg-dim) + (prose-metadata-value fg-alt) + (prose-table fg-alt) + (prose-tag magenta-faint) + (prose-todo red) + (prose-verbatim magenta-warmer) + +;;;; Rainbow mappings + + (rainbow-0 fg-main) + (rainbow-1 magenta-intense) + (rainbow-2 cyan-intense) + (rainbow-3 red-warmer) + (rainbow-4 yellow-intense) + (rainbow-5 magenta-cooler) + (rainbow-6 green-intense) + (rainbow-7 blue-warmer) + (rainbow-8 magenta-warmer) + +;;;; Space mappings + + (bg-space unspecified) + (fg-space border) + (bg-space-err bg-red-intense) + +;;;; Terminal mappings + + (bg-term-black "black") + (fg-term-black "black") + (bg-term-black-bright "gray35") + (fg-term-black-bright "gray35") + + (bg-term-red red) + (fg-term-red red) + (bg-term-red-bright red-warmer) + (fg-term-red-bright red-warmer) + + (bg-term-green green) + (fg-term-green green) + (bg-term-green-bright green-cooler) + (fg-term-green-bright green-cooler) + + (bg-term-yellow yellow) + (fg-term-yellow yellow) + (bg-term-yellow-bright yellow-warmer) + (fg-term-yellow-bright yellow-warmer) + + (bg-term-blue blue) + (fg-term-blue blue) + (bg-term-blue-bright blue-warmer) + (fg-term-blue-bright blue-warmer) + + (bg-term-magenta magenta) + (fg-term-magenta magenta) + (bg-term-magenta-bright magenta-cooler) + (fg-term-magenta-bright magenta-cooler) + + (bg-term-cyan cyan) + (fg-term-cyan cyan) + (bg-term-cyan-bright cyan-cooler) + (fg-term-cyan-bright cyan-cooler) + + (bg-term-white "gray65") + (fg-term-white "gray65") + (bg-term-white-bright "white") + (fg-term-white-bright "white") + +;;;; Heading mappings + + (fg-heading-0 cyan-cooler) + (fg-heading-1 fg-main) + (fg-heading-2 yellow-faint) + (fg-heading-3 fg-alt) + (fg-heading-4 magenta) + (fg-heading-5 green-faint) + (fg-heading-6 red-faint) + (fg-heading-7 cyan-warmer) + (fg-heading-8 fg-dim) + + (bg-heading-0 unspecified) + (bg-heading-1 unspecified) + (bg-heading-2 unspecified) + (bg-heading-3 unspecified) + (bg-heading-4 unspecified) + (bg-heading-5 unspecified) + (bg-heading-6 unspecified) + (bg-heading-7 unspecified) + (bg-heading-8 unspecified) + + (overline-heading-0 unspecified) + (overline-heading-1 unspecified) + (overline-heading-2 unspecified) + (overline-heading-3 unspecified) + (overline-heading-4 unspecified) + (overline-heading-5 unspecified) + (overline-heading-6 unspecified) + (overline-heading-7 unspecified) + (overline-heading-8 unspecified)) + "The entire palette of the `modus-operandi-tinted' theme. + +Named colors have the form (COLOR-NAME HEX-VALUE) with the former +as a symbol and the latter as a string. + +Semantic color mappings have the form (MAPPING-NAME COLOR-NAME) +with both as symbols. The latter is a named color that already +exists in the palette and is associated with a HEX-VALUE.") + + (defcustom modus-operandi-tinted-palette-overrides nil + "Overrides for `modus-operandi-tinted-palette'. + +Mirror the elements of the aforementioned palette, overriding +their value. + +For overrides that are shared across all of the Modus themes, +refer to `modus-themes-common-palette-overrides'. + +Theme-specific overrides take precedence over shared overrides. +The idea of common overrides is to change semantic color +mappings, such as to make the cursor red. Wherea theme-specific +overrides can also be used to change the value of a named color, +such as what hexadecimal RGB value the red-warmer symbol +represents." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type '(repeat (list symbol (choice symbol string))) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Palette overrides")) + + (modus-themes-theme modus-operandi-tinted + modus-operandi-tinted-palette + modus-operandi-tinted-palette-overrides) + + (provide-theme 'modus-operandi-tinted)) + +;;; modus-operandi-tinted-theme.el ends here diff --git a/elpa/modus-themes-4.3.0/modus-operandi-tritanopia-theme.el b/elpa/modus-themes-4.3.0/modus-operandi-tritanopia-theme.el @@ -0,0 +1,486 @@ +;;; modus-operandi-tritanopia-theme.el --- Tritanopia-optimized theme with a white background -*- lexical-binding:t -*- + +;; Copyright (C) 2019-2023 Free Software Foundation, Inc. + +;; Author: Protesilaos Stavrou <info@protesilaos.com> +;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> +;; URL: https://git.sr.ht/~protesilaos/modus-themes +;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes +;; Keywords: faces, theme, accessibility + +;; 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: +;; +;; The Modus themes conform with the highest standard for +;; color-contrast accessibility between background and foreground +;; values (WCAG AAA). Please refer to the official Info manual for +;; further documentation (distributed with the themes, or available +;; at: <https://protesilaos.com/emacs/modus-themes>). + +;;; Code: + + + +(eval-and-compile + (unless (and (fboundp 'require-theme) + load-file-name + (equal (file-name-directory load-file-name) + (expand-file-name "themes/" data-directory)) + (require-theme 'modus-themes t)) + (require 'modus-themes)) + +;;;###theme-autoload + (deftheme modus-operandi-tritanopia + "Tritanopia-optimized theme with a white background. +This variant is optimized for users with blue-yellow color +deficiency (tritanopia). It conforms with the highest +legibility standard for color contrast between background and +foreground in any given piece of text, which corresponds to a +minimum contrast in relative luminance of 7:1 (WCAG AAA +standard)." + :background-mode 'light + :kind 'color-scheme + :family 'modus) + + (defconst modus-operandi-tritanopia-palette + '( +;;; Basic values + + (bg-main "#ffffff") + (bg-dim "#f2f2f2") + (fg-main "#000000") + (fg-dim "#595959") + (fg-alt "#193668") + (bg-active "#c4c4c4") + (bg-inactive "#e0e0e0") + (border "#9f9f9f") + +;;; Common accent foregrounds + + (red "#a60000") + (red-warmer "#b21100") + (red-cooler "#a0132f") + (red-faint "#702000") + (red-intense "#d00000") + (green "#006800") + (green-warmer "#316500") + (green-cooler "#00663f") + (green-faint "#2a5045") + (green-intense "#008900") + (yellow "#695500") + (yellow-warmer "#973300") + (yellow-cooler "#77492f") + (yellow-faint "#624416") + (yellow-intense "#808000") + (blue "#0031a9") + (blue-warmer "#3548cf") + (blue-cooler "#0000b0") + (blue-faint "#003497") + (blue-intense "#0000ff") + (magenta "#721045") + (magenta-warmer "#8f0075") + (magenta-cooler "#531ab6") + (magenta-faint "#7c318f") + (magenta-intense "#cd22bd") + (cyan "#005e8b") + (cyan-warmer "#3f578f") + (cyan-cooler "#005f5f") + (cyan-faint "#004f5f") + (cyan-intense "#008899") + +;;; Uncommon accent foregrounds + + (rust "#8a290f") + (gold "#80601f") + (olive "#56692d") + (slate "#2f3f83") + (indigo "#4a3a8a") + (maroon "#731c52") + (pink "#7b435c") + +;;; Common accent backgrounds + + (bg-red-intense "#ff8f88") + (bg-green-intense "#8adf80") + (bg-yellow-intense "#f3d000") + (bg-blue-intense "#bfc9ff") + (bg-magenta-intense "#dfa0f0") + (bg-cyan-intense "#a4d5f9") + + (bg-red-subtle "#ffcfbf") + (bg-green-subtle "#b3fabf") + (bg-yellow-subtle "#fff576") + (bg-blue-subtle "#ccdfff") + (bg-magenta-subtle "#ffddff") + (bg-cyan-subtle "#bfefff") + + (bg-red-nuanced "#fff1f0") + (bg-green-nuanced "#ecf7ed") + (bg-yellow-nuanced "#fff3da") + (bg-blue-nuanced "#f3f3ff") + (bg-magenta-nuanced "#fdf0ff") + (bg-cyan-nuanced "#ebf6fa") + +;;; Uncommon accent backgrounds + + (bg-ochre "#f0e0cc") + (bg-lavender "#dfdbfa") + (bg-sage "#c0e7d4") + +;;; Graphs + + (bg-graph-red-0 "#ef7969") + (bg-graph-red-1 "#ffaab4") + (bg-graph-green-0 "#70c3b0") + (bg-graph-green-1 "#a3dfe5") + (bg-graph-yellow-0 "#d99f9f") + (bg-graph-yellow-1 "#ffb58f") + (bg-graph-blue-0 "#80a0df") + (bg-graph-blue-1 "#9fcaff") + (bg-graph-magenta-0 "#efafcf") + (bg-graph-magenta-1 "#ffdaef") + (bg-graph-cyan-0 "#7fd3ed") + (bg-graph-cyan-1 "#afefff") + +;;; Special purpose + + (bg-completion "#afdfef") + (bg-hover "#ffafbc") + (bg-hover-secondary "#9fdfff") + (bg-hl-line "#dfeaec") + (bg-region "#bdbdbd") + (fg-region "#000000") + + (bg-char-0 "#ff908f") + (bg-char-1 "#bfbfff") + (bg-char-2 "#5fcfdf") + + (bg-mode-line-active "#afe0f2") + (fg-mode-line-active "#0f0f0f") + (border-mode-line-active "#2f4f44") + (bg-mode-line-inactive "#e6e6e6") + (fg-mode-line-inactive "#585858") + (border-mode-line-inactive "#a3a3a3") + + (modeline-err "#8f0000") + (modeline-warning "#6f306f") + (modeline-info "#00445f") + + (bg-tab-bar "#dfdfdf") + (bg-tab-current "#ffffff") + (bg-tab-other "#c2c2c2") + +;;; Diffs + + (bg-added "#b5e7ff") + (bg-added-faint "#c6f6ff") + (bg-added-refine "#9adcef") + (bg-added-fringe "#1782cc") + (fg-added "#005079") + (fg-added-intense "#0043aa") + + (bg-changed "#eecfdf") + (bg-changed-faint "#f0dde5") + (bg-changed-refine "#e0b0d0") + (bg-changed-fringe "#9f6ab0") + (fg-changed "#6f1343") + (fg-changed-intense "#7f0f9f") + + (bg-removed "#ffd8d5") + (bg-removed-faint "#ffe9e9") + (bg-removed-refine "#f3b5af") + (bg-removed-fringe "#d84a4f") + (fg-removed "#8f1313") + (fg-removed-intense "#aa2222") + + (bg-diff-context "#f3f3f3") + +;;; Paren match + + (bg-paren-match "#5fcfff") + (bg-paren-expression "#efd3f5") + (underline-paren-match unspecified) + +;;; Mappings + +;;;; General mappings + + (fringe bg-dim) + (cursor red-intense) + + (keybind red) + (name red-cooler) + (identifier red-faint) + + (err red-warmer) + (warning magenta) + (info cyan) + + (underline-err red-intense) + (underline-warning magenta-intense) + (underline-note cyan-intense) + + (bg-prominent-err bg-red-intense) + (fg-prominent-err fg-main) + (bg-prominent-warning bg-magenta-intense) + (fg-prominent-warning fg-main) + (bg-prominent-note bg-cyan-intense) + (fg-prominent-note fg-main) + +;;;; Code mappings + + (builtin magenta) + (comment red-faint) + (constant green-cooler) + (docstring fg-alt) + (docmarkup magenta-faint) + (fnname cyan-warmer) + (keyword red-cooler) + (preprocessor red-warmer) + (string cyan) + (type blue-warmer) + (variable cyan-cooler) + (rx-construct red) + (rx-backslash magenta) + +;;;; Accent mappings + + (accent-0 cyan) + (accent-1 red-warmer) + (accent-2 cyan-cooler) + (accent-3 magenta) + +;;;; Button mappings + + (fg-button-active fg-main) + (fg-button-inactive fg-dim) + (bg-button-active bg-active) + (bg-button-inactive bg-dim) + +;;;; Completion mappings + + (fg-completion-match-0 cyan) + (fg-completion-match-1 red-warmer) + (fg-completion-match-2 magenta) + (fg-completion-match-3 cyan-cooler) + (bg-completion-match-0 unspecified) + (bg-completion-match-1 unspecified) + (bg-completion-match-2 unspecified) + (bg-completion-match-3 unspecified) + +;;;; Date mappings + + (date-common cyan-cooler) + (date-deadline red) + (date-event fg-alt) + (date-holiday red) + (date-holiday-other cyan) + (date-now fg-main) + (date-range fg-alt) + (date-scheduled magenta) + (date-weekday cyan) + (date-weekend red-faint) + +;;;; Line number mappings + + (fg-line-number-inactive fg-dim) + (fg-line-number-active fg-main) + (bg-line-number-inactive bg-dim) + (bg-line-number-active bg-active) + +;;;; Link mappings + + (fg-link cyan) + (bg-link unspecified) + (underline-link cyan) + + (fg-link-symbolic cyan-cooler) + (bg-link-symbolic unspecified) + (underline-link-symbolic cyan-cooler) + + (fg-link-visited magenta) + (bg-link-visited unspecified) + (underline-link-visited magenta) + +;;;; Mail mappings + + (mail-cite-0 cyan-faint) + (mail-cite-1 red-faint) + (mail-cite-2 magenta-warmer) + (mail-cite-3 cyan-warmer) + (mail-part cyan-cooler) + (mail-recipient cyan) + (mail-subject red-cooler) + (mail-other cyan) + +;;;; Mark mappings + + (bg-mark-delete bg-red-subtle) + (fg-mark-delete red) + (bg-mark-select bg-cyan-subtle) + (fg-mark-select cyan) + (bg-mark-other bg-magenta-subtle) + (fg-mark-other magenta) + +;;;; Prompt mappings + + (fg-prompt cyan-cooler) + (bg-prompt unspecified) + +;;;; Prose mappings + + (prose-block fg-dim) + (prose-code cyan) + (prose-done cyan) + (prose-macro red-warmer) + (prose-metadata fg-dim) + (prose-metadata-value fg-alt) + (prose-table fg-alt) + (prose-tag fg-alt) + (prose-todo red) + (prose-verbatim magenta-warmer) + +;;;; Rainbow mappings + + (rainbow-0 cyan) + (rainbow-1 red) + (rainbow-2 cyan-warmer) + (rainbow-3 red-cooler) + (rainbow-4 cyan-cooler) + (rainbow-5 magenta) + (rainbow-6 cyan-faint) + (rainbow-7 magenta-faint) + (rainbow-8 red-faint) + +;;;; Space mappings + + (bg-space unspecified) + (fg-space border) + (bg-space-err bg-red-intense) + +;;;; Terminal mappings + + (bg-term-black "black") + (fg-term-black "black") + (bg-term-black-bright "gray35") + (fg-term-black-bright "gray35") + + (bg-term-red red) + (fg-term-red red) + (bg-term-red-bright red-warmer) + (fg-term-red-bright red-warmer) + + (bg-term-green green) + (fg-term-green green) + (bg-term-green-bright green-cooler) + (fg-term-green-bright green-cooler) + + (bg-term-yellow yellow) + (fg-term-yellow yellow) + (bg-term-yellow-bright yellow-warmer) + (fg-term-yellow-bright yellow-warmer) + + (bg-term-blue blue) + (fg-term-blue blue) + (bg-term-blue-bright blue-warmer) + (fg-term-blue-bright blue-warmer) + + (bg-term-magenta magenta) + (fg-term-magenta magenta) + (bg-term-magenta-bright magenta-cooler) + (fg-term-magenta-bright magenta-cooler) + + (bg-term-cyan cyan) + (fg-term-cyan cyan) + (bg-term-cyan-bright cyan-cooler) + (fg-term-cyan-bright cyan-cooler) + + (bg-term-white "gray65") + (fg-term-white "gray65") + (bg-term-white-bright "white") + (fg-term-white-bright "white") + +;;;; Heading mappings + + (fg-heading-0 cyan-cooler) + (fg-heading-1 fg-main) + (fg-heading-2 red-faint) + (fg-heading-3 cyan-faint) + (fg-heading-4 magenta) + (fg-heading-5 green-faint) + (fg-heading-6 magenta-faint) + (fg-heading-7 cyan-warmer) + (fg-heading-8 fg-dim) + + (bg-heading-0 unspecified) + (bg-heading-1 unspecified) + (bg-heading-2 unspecified) + (bg-heading-3 unspecified) + (bg-heading-4 unspecified) + (bg-heading-5 unspecified) + (bg-heading-6 unspecified) + (bg-heading-7 unspecified) + (bg-heading-8 unspecified) + + (overline-heading-0 unspecified) + (overline-heading-1 unspecified) + (overline-heading-2 unspecified) + (overline-heading-3 unspecified) + (overline-heading-4 unspecified) + (overline-heading-5 unspecified) + (overline-heading-6 unspecified) + (overline-heading-7 unspecified) + (overline-heading-8 unspecified)) + "The entire palette of the `modus-operandi-tritanopia' theme. + +Named colors have the form (COLOR-NAME HEX-VALUE) with the former +as a symbol and the latter as a string. + +Semantic color mappings have the form (MAPPING-NAME COLOR-NAME) +with both as symbols. The latter is a named color that already +exists in the palette and is associated with a HEX-VALUE.") + + (defcustom modus-operandi-tritanopia-palette-overrides nil + "Overrides for `modus-operandi-tritanopia-palette'. + +Mirror the elements of the aforementioned palette, overriding +their value. + +For overrides that are shared across all of the Modus themes, +refer to `modus-themes-common-palette-overrides'. + +Theme-specific overrides take precedence over shared overrides. +The idea of common overrides is to change semantic color +mappings, such as to make the cursor red. Wherea theme-specific +overrides can also be used to change the value of a named color, +such as what hexadecimal RGB value the red-warmer symbol +represents." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type '(repeat (list symbol (choice symbol string))) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Palette overrides")) + + (modus-themes-theme modus-operandi-tritanopia + modus-operandi-tritanopia-palette + modus-operandi-tritanopia-palette-overrides) + + (provide-theme 'modus-operandi-tritanopia)) + +;;; modus-operandi-tritanopia-theme.el ends here diff --git a/elpa/modus-themes-4.3.0/modus-themes-autoloads.el b/elpa/modus-themes-4.3.0/modus-themes-autoloads.el @@ -0,0 +1,60 @@ +;;; modus-themes-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; Generated autoloads from modus-themes.el + +(autoload 'modus-themes-contrast "modus-themes" "\ +Measure WCAG contrast ratio between C1 and C2. +C1 and C2 are color values written in hexadecimal RGB. + +(fn C1 C2)") +(autoload 'modus-themes-select "modus-themes" "\ +Load a Modus THEME using minibuffer completion. +Run `modus-themes-after-load-theme-hook' after loading the theme. +Disable other themes per `modus-themes-disable-other-themes'. + +(fn THEME)" t) +(autoload 'modus-themes-toggle "modus-themes" "\ +Toggle between the two `modus-themes-to-toggle'. +If `modus-themes-to-toggle' does not specify two Modus themes, +prompt with completion for a theme among our collection (this is +practically the same as the `modus-themes-select' command). + +Run `modus-themes-after-load-theme-hook' after loading the theme. +Disable other themes per `modus-themes-disable-other-themes'." t) +(autoload 'modus-themes-theme "modus-themes" "\ +Bind NAME's color PALETTE around face specs and variables. +Face specifications are passed to `custom-theme-set-faces'. +While variables are handled by `custom-theme-set-variables'. +Those are stored in `modus-themes-faces' and +`modus-themes-custom-variables' respectively. + +Optional OVERRIDES are appended to PALETTE, overriding +corresponding entries. + +(fn NAME PALETTE &optional OVERRIDES)" nil t) +(function-put 'modus-themes-theme 'lisp-indent-function 0) +(when load-file-name (let ((dir (file-name-directory load-file-name))) (unless (equal dir (expand-file-name "themes/" data-directory)) (add-to-list 'custom-theme-load-path dir)))) +(register-definition-prefixes "modus-themes" '("modus-themes-")) + +;;; End of scraped data + +(provide 'modus-themes-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; modus-themes-autoloads.el ends here diff --git a/elpa/modus-themes-4.3.0/modus-themes-pkg.el b/elpa/modus-themes-4.3.0/modus-themes-pkg.el @@ -0,0 +1,2 @@ +;; Generated package description from modus-themes.el -*- no-byte-compile: t -*- +(define-package "modus-themes" "4.3.0" "Elegant, highly legible and customizable themes" '((emacs "27.1")) :commit "fe08a02c4c0501a984b15af3f8c3c5e4769b93ad" :authors '(("Protesilaos Stavrou" . "info@protesilaos.com")) :maintainer '("Modus-Themes Development" . "~protesilaos/modus-themes@lists.sr.ht") :keywords '("faces" "theme" "accessibility") :url "https://git.sr.ht/~protesilaos/modus-themes") diff --git a/elpa/modus-themes-4.3.0/modus-themes.el b/elpa/modus-themes-4.3.0/modus-themes.el @@ -0,0 +1,4237 @@ +;;; modus-themes.el --- Elegant, highly legible and customizable themes -*- lexical-binding:t -*- + +;; Copyright (C) 2019-2023 Free Software Foundation, Inc. + +;; Author: Protesilaos Stavrou <info@protesilaos.com> +;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> +;; URL: https://git.sr.ht/~protesilaos/modus-themes +;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes +;; Version: 4.3.0 +;; Package-Requires: ((emacs "27.1")) +;; Keywords: faces, theme, accessibility + +;; 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: +;; +;; The Modus themes conform with the highest standard for +;; color-contrast accessibility between background and foreground +;; values (WCAG AAA). Please refer to the official Info manual for +;; further documentation (distributed with the themes, or available +;; at: <https://protesilaos.com/emacs/modus-themes>). + +;;; Code: + + + +(eval-when-compile + (require 'cl-lib) + (require 'subr-x)) + +(defgroup modus-themes () + "User options for the Modus themes. +The Modus themes conform with the WCAG AAA standard for color +contrast between background and foreground combinations (a +minimum contrast of 7:1---the highest standard of its kind). + +The Modus themes collection includes themes that are optimized +for people with red-green or blue-yellow color +deficiency (deuteranopia or tritanopia, respectively)." + :group 'faces + :link '(info-link "(modus-themes) Top") + :link '(url-link :tag "Homepage" "https://protesilaos.com/emacs/modus-themes") + :link '(url-link :tag "Sample pictures" "https://protesilaos.com/emacs/modus-themes-pictures") + :prefix "modus-themes-" + :tag "Modus Themes") + +(defgroup modus-themes-faces () + "Faces defined by the Modus themes." + :group 'modus-themes + :link '(info-link "(modus-themes) Top") + :link '(url-link :tag "Homepage" "https://protesilaos.com/emacs/modus-themes") + :link '(url-link :tag "Sample pictures" "https://protesilaos.com/emacs/modus-themes-pictures") + :prefix "modus-themes-" + :tag "Modus Themes Faces") + +(make-obsolete-variable 'modus-themes-operandi-colors nil "4.0.0") +(make-obsolete-variable 'modus-themes-vivendi-colors nil "4.0.0") +(make-obsolete-variable 'modus-themes-version nil "4.0.0") +(make-obsolete 'modus-themes-report-bug nil "4.0.0") + + + +;;;; Custom faces + +;; These faces are used internally to ensure consistency between various +;; groups and to streamline the evaluation of relevant customization +;; options. + +(dolist (color '( red green blue yellow magenta cyan + red-warmer green-warmer blue-warmer yellow-warmer magenta-warmer cyan-warmer + red-cooler green-cooler blue-cooler yellow-cooler magenta-cooler cyan-cooler + red-faint green-faint blue-faint yellow-faint magenta-faint cyan-faint + red-intense green-intense blue-intense yellow-intense magenta-intense cyan-intense)) + (custom-declare-face + (intern (format "modus-themes-fg-%s" color)) + nil (format "Face with %s foreground." color) + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces)) + +(dolist (color '(red green yellow blue magenta cyan)) + (custom-declare-face + (intern (format "modus-themes-nuanced-%s" color)) + nil (format "Nuanced %s background." color) + :package-version '(modus-themes . "4.1.0") + :version "30.1" + :group 'modus-themes-faces)) + +(dolist (color '(red green yellow blue magenta cyan)) + (custom-declare-face + (intern (format "modus-themes-subtle-%s" color)) + nil (format "Subtle %s background." color) + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces)) + +(dolist (color '(red green yellow blue magenta cyan)) + (custom-declare-face + (intern (format "modus-themes-intense-%s" color)) + nil (format "Intense %s background." color) + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces)) + +(dolist (scope '(alt del sel)) + (custom-declare-face + (intern (format "modus-themes-mark-%s" scope)) + nil (format "Mark of type %s." scope) + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces)) + +(dolist (scope '(note warning error)) + (custom-declare-face + (intern (format "modus-themes-lang-%s" scope)) + nil (format "Linter or spell check of type %s." scope) + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces)) + +(dolist (scope '(note warning error)) + (custom-declare-face + (intern (format "modus-themes-prominent-%s" scope)) + nil (format "Prominent notification of type %s." scope) + :package-version '(modus-themes . "4.2.0") + :version "30.1" + :group 'modus-themes-faces)) + +(dolist (scope '(current lazy)) + (custom-declare-face + (intern (format "modus-themes-search-%s" scope)) + nil (format "Search of type %s." scope) + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces)) + +(define-obsolete-variable-alias + 'modus-themes-search-success + 'modus-themes-search-current + "4.0.0") + +(define-obsolete-variable-alias + 'modus-themes-search-success-lazy + 'modus-themes-search-lazy + "4.0.0") + +(dolist (scope '(code macro verbatim)) + (custom-declare-face + (intern (format "modus-themes-prose-%s" scope)) + nil (format "Construct of type %s for prose." scope) + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces)) + +(define-obsolete-variable-alias + 'modus-themes-markup-code + 'modus-themes-prose-code + "4.0.0") + +(define-obsolete-variable-alias + 'modus-themes-markup-macro + 'modus-themes-prose-macro + "4.0.0") + +(define-obsolete-variable-alias + 'modus-themes-markup-verbatim + 'modus-themes-prose-verbatim + "4.0.0") + +(dotimes (n 9) + (custom-declare-face + (intern (format "modus-themes-heading-%d" n)) + nil (format "Level %d heading." n) + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces)) + +(defface modus-themes-bold nil + "Generic face for applying a conditional bold weight. +This behaves in accordance with `modus-themes-bold-constructs'." + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces) + +(defface modus-themes-slant nil + "Generic face for applying a conditional slant (italics). +This behaves in accordance with `modus-themes-italic-constructs'." + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces) + +(defface modus-themes-key-binding nil + "Face for key bindings." + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces) + +(defface modus-themes-fixed-pitch nil + "Face for `fixed-pitch' if `modus-themes-mixed-fonts' is non-nil." + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces) + +(defface modus-themes-ui-variable-pitch nil + "Face for `variable-pitch' if `modus-themes-variable-pitch-ui' is non-nil." + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces) + +(defface modus-themes-reset-soft nil + "Generic face to set most face properties to nil. + +This is intended to be inherited by faces that should not retain +properties from their context (e.g. an overlay over an underlined +text should not be underlined as well) yet still blend in." + :group 'modus-themes-faces) + +(defface modus-themes-prompt nil + "Generic face for command prompts." + :group 'modus-themes-faces) + +(defface modus-themes-completion-selected nil + "Face for current selection in completion UIs." + :group 'modus-themes-faces) + +(defface modus-themes-button nil + "Face for graphical buttons." + :group 'modus-themes-faces) + +(dotimes (n 4) + (custom-declare-face + (intern (format "modus-themes-completion-match-%d" n)) + nil (format "Completions match level %d." n) + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :group 'modus-themes-faces)) + +(make-obsolete-variable 'modus-themes-reset-hard nil "4.0.0") +(make-obsolete-variable 'modus-themes-subtle-neutral nil "4.0.0") +(make-obsolete-variable 'modus-themes-intense-neutral nil "4.0.0") +(make-obsolete-variable 'modus-themes-refine-red nil "4.0.0") +(make-obsolete-variable 'modus-themes-refine-green nil "4.0.0") +(make-obsolete-variable 'modus-themes-refine-yellow nil "4.0.0") +(make-obsolete-variable 'modus-themes-refine-blue nil "4.0.0") +(make-obsolete-variable 'modus-themes-refine-magenta nil "4.0.0") +(make-obsolete-variable 'modus-themes-refine-cyan nil "4.0.0") +(make-obsolete-variable 'modus-themes-active-red nil "4.0.0") +(make-obsolete-variable 'modus-themes-active-green nil "4.0.0") +(make-obsolete-variable 'modus-themes-active-yellow nil "4.0.0") +(make-obsolete-variable 'modus-themes-active-blue nil "4.0.0") +(make-obsolete-variable 'modus-themes-active-magenta nil "4.0.0") +(make-obsolete-variable 'modus-themes-active-cyan nil "4.0.0") +(make-obsolete-variable 'modus-themes-fringe-red nil "4.0.0") +(make-obsolete-variable 'modus-themes-fringe-green nil "4.0.0") +(make-obsolete-variable 'modus-themes-fringe-yellow nil "4.0.0") +(make-obsolete-variable 'modus-themes-fringe-blue nil "4.0.0") +(make-obsolete-variable 'modus-themes-fringe-magenta nil "4.0.0") +(make-obsolete-variable 'modus-themes-fringe-cyan nil "4.0.0") +(make-obsolete-variable 'modus-themes-grue nil "4.0.0") +(make-obsolete-variable 'modus-themes-grue-nuanced nil "4.0.0") +(make-obsolete-variable 'modus-themes-red-nuanced nil "4.0.0") +(make-obsolete-variable 'modus-themes-green-nuanced nil "4.0.0") +(make-obsolete-variable 'modus-themes-yellow-nuanced nil "4.0.0") +(make-obsolete-variable 'modus-themes-blue-nuanced nil "4.0.0") +(make-obsolete-variable 'modus-themes-magenta-nuanced nil "4.0.0") +(make-obsolete-variable 'modus-themes-cyan-nuanced nil "4.0.0") +(make-obsolete-variable 'modus-themes-special-calm nil "4.0.0") +(make-obsolete-variable 'modus-themes-special-cold nil "4.0.0") +(make-obsolete-variable 'modus-themes-special-mild nil "4.0.0") +(make-obsolete-variable 'modus-themes-special-warm nil "4.0.0") +(make-obsolete-variable 'modus-themes-diff-added nil "4.0.0") +(make-obsolete-variable 'modus-themes-diff-changed nil "4.0.0") +(make-obsolete-variable 'modus-themes-diff-removed nil "4.0.0") +(make-obsolete-variable 'modus-themes-diff-refine-added nil "4.0.0") +(make-obsolete-variable 'modus-themes-diff-refine-changed nil "4.0.0") +(make-obsolete-variable 'modus-themes-diff-refine-removed nil "4.0.0") +(make-obsolete-variable 'modus-themes-diff-focus-added nil "4.0.0") +(make-obsolete-variable 'modus-themes-diff-focus-changed nil "4.0.0") +(make-obsolete-variable 'modus-themes-diff-focus-removed nil "4.0.0") +(make-obsolete-variable 'modus-themes-diff-heading nil "4.0.0") +(make-obsolete-variable 'modus-themes-pseudo-header nil "4.0.0") +(make-obsolete-variable 'modus-themes-mark-symbol nil "4.0.0") +(make-obsolete-variable 'modus-themes-hl-line nil "4.0.0") +(make-obsolete-variable 'modus-themes-search-success-modeline nil "4.0.0") +(make-obsolete-variable 'modus-themes-grue-active nil "4.0.0") +(make-obsolete-variable 'modus-themes-grue-background-active nil "4.0.0") +(make-obsolete-variable 'modus-themes-grue-background-intense nil "4.0.0") +(make-obsolete-variable 'modus-themes-grue-background-subtle nil "4.0.0") +(make-obsolete-variable 'modus-themes-grue-background-refine nil "4.0.0") +(make-obsolete-variable 'modus-themes-link-broken nil "4.0.0") +(make-obsolete-variable 'modus-themes-link-symlink nil "4.0.0") +(make-obsolete-variable 'modus-themes-tab-backdrop nil "4.0.0") +(make-obsolete-variable 'modus-themes-tab-active nil "4.0.0") +(make-obsolete-variable 'modus-themes-tab-inactive nil "4.0.0") +(make-obsolete-variable 'modus-themes-completion-selected-popup nil "4.0.0") +(make-obsolete-variable 'modus-themes-box-button nil "4.0.0") +(make-obsolete-variable 'modus-themes-box-button-pressed nil "4.0.0") + + + +;;;; Customization variables + +(defcustom modus-themes-custom-auto-reload t + "Automatically reload theme after setting options with Customize. + +All theme user options take effect when a theme is loaded. Any +subsequent changes require the theme to be reloaded. + +When this variable has a non-nil value, any change made via the +Custom UI or related functions such as `customize-set-variable' +and `setopt' (Emacs 29), will trigger a reload automatically. + +With a nil value, changes to user options have no further +consequences. The user must manually reload the theme." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type 'boolean + :link '(info-link "(modus-themes) Custom reload theme")) + +(make-obsolete-variable 'modus-themes-inhibit-reload 'modus-themes-custom-auto-reload "4.0.0") + +(defun modus-themes--set-option (sym val) + "Custom setter for theme related user options. +Will set SYM to VAL, and reload the current theme, unless +`modus-themes-custom-auto-reload' is nil." + (set-default sym val) + (when (and modus-themes-custom-auto-reload + ;; Check if a theme is being loaded, in which case we + ;; don't want to reload a theme if the setter is + ;; invoked. `custom--inhibit-theme-enable' is set to nil + ;; by `enable-theme'. + (bound-and-true-p custom--inhibit-theme-enable)) + (when-let* ((modus-themes-custom-auto-reload t) + (theme (modus-themes--current-theme))) + (modus-themes-load-theme theme)))) + +(defcustom modus-themes-disable-other-themes t + "Disable all other themes when loading a Modus theme. + +When the value is non-nil, the commands `modus-themes-toggle' and +`modus-themes-select', as well as the `modus-themes-load-theme' +function, will disable all other themes while loading the +specified Modus theme. This is done to ensure that Emacs does +not blend two or more themes: such blends lead to awkward results +that undermine the work of the designer. + +When the value is nil, the aforementioned commands and function +will only disable other themes within the Modus collection. + +This option is provided because Emacs themes are not necessarily +limited to colors/faces: they can consist of an arbitrary set of +customizations. Users who use such customization bundles must +set this variable to a nil value." + :group 'modus-themes + :package-version '(modus-themes . "4.1.0") + :version "30.1" + :type 'boolean + :link '(info-link "(modus-themes) Disable other themes")) + +(defvaralias 'modus-themes-collection 'modus-themes-items + "Alias of `modus-themes-items'.") + +(defconst modus-themes-items + '( modus-operandi modus-vivendi + modus-operandi-tinted modus-vivendi-tinted + modus-operandi-deuteranopia modus-vivendi-deuteranopia + modus-operandi-tritanopia modus-vivendi-tritanopia) + "Symbols of the Modus themes.") + +(defcustom modus-themes-to-toggle '(modus-operandi modus-vivendi) + "Specify two Modus themes for `modus-themes-toggle' command. +The variable `modus-themes-items' contains the symbols of all +official themes that form part of this collection. + +The default value of this user option includes the original +themes: `modus-operandi' (light) and `modus-vivendi' (dark). + +If the value is nil or otherwise does not specify two valid Modus +themes, the command `modus-themes-toggle' reverts to selecting a +theme from the list of available Modus themes. In effect, it is +the same as using the command `modus-themes-select'." + :type `(choice + (const :tag "No toggle" nil) + (list :tag "Pick two themes to toggle between" + (choice :tag "Theme one of two" + ,@(mapcar (lambda (theme) + (list 'const theme)) + modus-themes-items)) + (choice :tag "Theme two of two" + ,@(mapcar (lambda (theme) + (list 'const theme)) + modus-themes-items)))) + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :group 'modus-themes) + +(defvaralias 'modus-themes-post-load-hook 'modus-themes-after-load-theme-hook) + +(defcustom modus-themes-after-load-theme-hook nil + "Hook that runs after loading a Modus theme. +This is used by the command `modus-themes-toggle'." + :type 'hook + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :group 'modus-themes) + +(make-obsolete-variable 'modus-themes-operandi-color-overrides nil "4.0.0") +(make-obsolete-variable 'modus-themes-vivendi-color-overrides nil "4.0.0") + +(defvaralias 'modus-themes-slanted-constructs 'modus-themes-italic-constructs) + +(defcustom modus-themes-italic-constructs nil + "Use italic font forms in more code constructs." + :group 'modus-themes + :package-version '(modus-themes . "1.5.0") + :version "28.1" + :type 'boolean + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Italic constructs")) + +(defcustom modus-themes-bold-constructs nil + "Use bold text in more code constructs." + :group 'modus-themes + :package-version '(modus-themes . "1.0.0") + :version "28.1" + :type 'boolean + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Bold constructs")) + +(defcustom modus-themes-variable-pitch-ui nil + "Use proportional fonts (variable-pitch) in UI elements. +This includes the mode line, header line, tab bar, and tab line." + :group 'modus-themes + :package-version '(modus-themes . "1.1.0") + :version "28.1" + :type 'boolean + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) UI typeface")) + +(defcustom modus-themes-mixed-fonts nil + "Non-nil to enable inheritance from `fixed-pitch' in some faces. + +This is done to allow spacing-sensitive constructs, such as Org +tables and code blocks, to remain monospaced when users opt for +something like the command `variable-pitch-mode'. + +Users may need to explicitly configure the font family of +`fixed-pitch' in order to get a consistent experience with their +typography (also check the `fontaine' package on GNU ELPA (by +Protesilaos))." + :group 'modus-themes + :package-version '(modus-themes . "1.7.0") + :version "29.1" + :type 'boolean + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Mixed fonts")) + +(make-obsolete-variable 'modus-themes-intense-mouseovers nil "4.0.0") + +(defconst modus-themes--weight-widget + '(choice :tag "Font weight (must be supported by the typeface)" + (const :tag "Unspecified (use whatever the default is)" nil) + (const :tag "Thin" thin) + (const :tag "Ultra-light" ultralight) + (const :tag "Extra-light" extralight) + (const :tag "Light" light) + (const :tag "Semi-light" semilight) + (const :tag "Regular" regular) + (const :tag "Medium" medium) + (const :tag "Semi-bold" semibold) + (const :tag "Bold" bold) + (const :tag "Extra-bold" extrabold) + (const :tag "Ultra-bold" ultrabold)) + "List of supported font weights used by `defcustom' forms.") + +(defconst modus-themes--headings-widget + `(set :tag "Properties" :greedy t + (const :tag "Proportionately spaced font (variable-pitch)" variable-pitch) + ,modus-themes--weight-widget + (radio :tag "Height" + (float :tag "Floating point to adjust height by") + (cons :tag "Cons cell of `(height . FLOAT)'" + (const :tag "The `height' key (constant)" height) + (float :tag "Floating point")))) + "Refer to the doc string of `modus-themes-headings'. +This is a helper variable intended for internal use.") + +(defcustom modus-themes-headings nil + "Heading styles with optional list of values per heading level. + +This is an alist that accepts a (KEY . LIST-OF-VALUES) +combination. The KEY is either a number, representing the +heading's level (0-8) or t, which pertains to the fallback style. +The named keys `agenda-date' and `agenda-structure' apply to the +Org agenda. + +Level 0 is used for what counts as a document title or +equivalent, such as the #+title construct we find in Org files. +Levels 1-8 are regular headings. + +The LIST-OF-VALUES covers symbols that refer to properties, as +described below. Here is a complete sample with various +stylistic combinations, followed by a presentation of all +available properties: + + (setq modus-themes-headings + (quote ((1 . (variable-pitch 1.5)) + (2 . (1.3)) + (agenda-date . (1.3)) + (agenda-structure . (variable-pitch light 1.8)) + (t . (1.1))))) + +By default (a nil value for this variable), all headings have a +bold typographic weight, use a desaturated text color, have a +font family that is the same as the `default' face (typically +monospaced), and a height that is equal to the `default' face's +height. + +A `variable-pitch' property changes the font family of the +heading to that of the `variable-pitch' face (normally a +proportionately spaced typeface). + +The symbol of a weight attribute adjusts the font of the heading +accordingly, such as `light', `semibold', etc. Valid symbols are +defined in the variable `modus-themes-weights'. The absence of a +weight means that bold will be used by virtue of inheriting the +`bold' face (check the manual for tweaking bold and italic +faces). + +A number, expressed as a floating point (e.g. 1.5), adjusts the +height of the heading to that many times the base font size. The +default height is the same as 1.0, though it need not be +explicitly stated. Instead of a floating point, an acceptable +value can be in the form of a cons cell like (height . FLOAT) +or (height FLOAT), where FLOAT is the given number. + +Combinations of any of those properties are expressed as a list, +like in these examples: + + (semibold) + (variable-pitch semibold 1.3) + (variable-pitch semibold (height 1.3)) ; same as above + (variable-pitch semibold (height . 1.3)) ; same as above + +The order in which the properties are set is not significant. + +In user configuration files the form may look like this: + + (setq modus-themes-headings + (quote ((1 . (variable-pitch 1.5)) + (2 . (1.3)) + (agenda-date . (1.3)) + (agenda-structure . (variable-pitch light 1.8)) + (t . (1.1))))) + +When defining the styles per heading level, it is possible to +pass a non-nil value (t) instead of a list of properties. This +will retain the original aesthetic for that level. For example: + + (setq modus-themes-headings + (quote ((1 . t) ; keep the default style + (2 . (semibold 1.2)) + (t . (variable-pitch))))) ; style for all other headings + + (setq modus-themes-headings + (quote ((1 . (variable-pitch extrabold 1.5)) + (2 . (semibold)) + (t . t)))) ; default style for all other levels + +Note that the text color of headings, of their background, and +overline can all be set via the overrides. It is possible to +have any color combination for any heading level (something that +could not be done in older versions of the themes). + +Read Info node `(modus-themes) Option for palette overrides' as +well as Info node `(modus-themes) Make headings more or less +colorful'. Else check `modus-themes-common-palette-overrides' +and related user options." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type `(alist + :options ,(mapcar (lambda (el) + (list el modus-themes--headings-widget)) + '(0 1 2 3 4 5 6 7 8 t agenda-date agenda-structure)) + :key-type symbol + :value-type ,modus-themes--headings-widget) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Heading styles")) + +(make-obsolete-variable 'modus-themes-org-agenda nil "4.0.0") +(make-obsolete-variable 'modus-themes-fringes nil "4.0.0") +(make-obsolete-variable 'modus-themes-lang-checkers nil "4.0.0") + +(defcustom modus-themes-org-blocks nil + "Set the overall style of Org code blocks, quotes, and the like. + +Nil (the default) means that the block has no background of its +own: it uses the one that applies to the rest of the buffer. In +this case, the delimiter lines have a gray color for their text, +making them look exactly like all other Org properties. + +Option `gray-background' applies a subtle gray background to the +block's contents. It also affects the begin and end lines of the +block as they get another shade of gray as their background, +which differentiates them from the contents of the block. All +background colors extend to the edge of the window, giving the +area a rectangular, \"blocky\" presentation. If the begin/end +lines do not extend in this way, check the value of the Org user +option `org-fontify-whole-block-delimiter-line'. + +Option `tinted-background' uses a colored background for the +contents of the block. The exact color value will depend on the +programming language and is controlled by the variable +`org-src-block-faces' (refer to the theme's source code for the +current association list). For this to take effect, the Org +buffer needs to be restarted with `org-mode-restart'. + +Code blocks use their major mode's fontification (syntax +highlighting) only when the variable `org-src-fontify-natively' +is non-nil. While quote/verse blocks require setting +`org-fontify-quote-and-verse-blocks' to a non-nil value." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type '(choice + (const :format "[%v] %t\n" :tag "No Org block background (default)" nil) + (const :format "[%v] %t\n" :tag "Subtle gray block background" gray-background) + (const :format "[%v] %t\n" :tag "Color-coded background per programming language" tinted-background)) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Org mode blocks")) + +(make-obsolete-variable 'modus-themes-mode-line nil "4.0.0") +(make-obsolete-variable 'modus-themes-diffs nil "4.0.0") + +(defcustom modus-themes-completions nil + "Control the style of completion user interfaces. + +This affects Company, Corfu, Flx, Icomplete/Fido, Ido, Ivy, +Orderless, Vertico, and the standard *Completions* buffer. The +value is an alist of expressions, each of which takes the form +of (KEY . LIST-OF-PROPERTIES). KEY is a symbol, while PROPERTIES +is a list. Here is a sample, followed by a description of the +particularities: + + (setq modus-themes-completions + (quote ((matches . (extrabold underline)) + (selection . (semibold italic))))) + +The `matches' key refers to the highlighted characters that +correspond to the user's input. When its properties are nil or +an empty list, matching characters in the user interface will +have a bold weight and a colored foreground. The list of +properties may include any of the following symbols regardless of +the order they may appear in: + +- `underline' to draw a line below the characters; + +- `italic' to use a slanted font (italic or oblique forms); + +- The symbol of a font weight attribute such as `light', + `semibold', et cetera. Valid symbols are defined in the + variable `modus-themes-weights'. The absence of a weight means + that bold will be used. + +The `selection' key applies to the current line or currently +matched candidate, depending on the specifics of the user +interface. When its properties are nil or an empty list, it has +a subtle gray background, a bold weight, and the base foreground +value for the text. The list of properties it accepts is as +follows (order is not significant): + +- `underline' to draw a line below the characters; + +- `italic' to use a slanted font (italic or oblique forms); + +- The symbol of a font weight attribute such as `light', + `semibold', et cetera. Valid symbols are defined in the + variable `modus-themes-weights'. The absence of a weight means + that bold will be used. + +Apart from specifying each key separately, a catch-all list is +accepted. This is only useful when the desired aesthetic is the +same across all keys that are not explicitly referenced. For +example, this: + + (setq modus-themes-completions + (quote ((t . (extrabold underline))))) + +Is the same as: + + (setq modus-themes-completions + (quote ((matches . (extrabold underline)) + (selection . (extrabold underline)))))" + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type `(set + (cons :tag "Matches" + (const matches) + (set :tag "Style of matches" :greedy t + ,modus-themes--weight-widget + (const :tag "Italic font (oblique or slanted forms)" italic) + (const :tag "Underline" underline))) + (cons :tag "Selection" + (const selection) + (set :tag "Style of selection" :greedy t + ,modus-themes--weight-widget + (const :tag "Italic font (oblique or slanted forms)" italic) + (const :tag "Underline" underline))) + (cons :tag "Fallback for both matches and selection" + (const t) + (set :tag "Style of both matches and selection" :greedy t + ,modus-themes--weight-widget + (const :tag "Italic font (oblique or slanted forms)" italic) + (const :tag "Underline" underline)))) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Completion UIs")) + +(defcustom modus-themes-prompts nil + "Use subtle or intense styles for minibuffer and REPL prompts. + +The value is a list of properties, each designated by a symbol. +The default (a nil value or an empty list) means to only use a +subtle colored foreground color. + +The `italic' property adds a slant to the font's forms (italic or +oblique forms, depending on the typeface). + +The symbol of a font weight attribute such as `light', `semibold', +et cetera, adds the given weight to links. Valid symbols are +defined in the variable `modus-themes-weights'. The absence of a +weight means that the one of the underlying text will be used. + +Combinations of any of those properties are expressed as a list, +like in these examples: + + (bold italic) + (italic semibold) + +The order in which the properties are set is not significant. + +In user configuration files the form may look like this: + + (setq modus-themes-prompts (quote (extrabold italic)))" + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type `(set :tag "Properties" :greedy t + (const :tag "Italic font slant" italic) + ,modus-themes--weight-widget) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Command prompts")) + +(make-obsolete-variable 'modus-themes-subtle-line-numbers nil "4.0.0") +(make-obsolete-variable 'modus-themes-markup nil "4.0.0") +(make-obsolete-variable 'modus-themes-paren-match nil "4.0.0") +(make-obsolete-variable 'modus-themes-syntax nil "4.0.0") +(make-obsolete-variable 'modus-themes-links nil "4.0.0") +(make-obsolete-variable 'modus-themes-region nil "4.0.0") +(make-obsolete-variable 'modus-themes-deuteranopia nil "4.0.0") +(make-obsolete-variable 'modus-themes-mail-citations nil "4.0.0") +(make-obsolete-variable 'modus-themes-tabs-accented nil "4.0.0") +(make-obsolete-variable 'modus-themes-box-buttons nil "4.0.0") + +(defcustom modus-themes-common-palette-overrides nil + "Set palette overrides for all the Modus themes. + +Mirror the elements of a theme's palette, overriding their value. +The palette variables are named THEME-NAME-palette, while +individual theme overrides are THEME-NAME-palette-overrides. The +THEME-NAME is one of the symbols in `modus-themes-items'. For +example: + +- `modus-operandi-palette' +- `modus-operandi-palette-overrides' + +Individual theme overrides take precedence over these common +overrides. + +The idea of common overrides is to change semantic color +mappings, such as to make the cursor red. Wherea theme-specific +overrides can also be used to change the value of a named color, +such as what hexadecimal RGB value the red-warmer symbol +represents." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type '(repeat (list symbol (choice symbol string))) + ;; ;; NOTE 2023-01-07: The following is a functioning version of the + ;; ;; intended :type. However, I think the Custom UI is really + ;; ;; awkward for this specific case. Maybe the generic type I have + ;; ;; above is better, as it encourages the user to write out the + ;; ;; code and read the manual. Counter-arguments are welcome. + ;; + ;; :type `(repeat (list (radio :tag "Palette key to override" + ;; ,@(mapcar (lambda (x) + ;; (list 'const x)) + ;; (mapcar #'car (modus-themes--current-theme-palette)))) + ;; (choice :tag "Value to assign" :value unspecified + ;; (const :tag "`unspecified' (remove the original color)" unspecified) + ;; (string :tag "String with color name (e.g. \"gray50\") or hex RGB (e.g. \"#123456\")" + ;; :match-inline (color-supported-p val)) + ;; (radio :tag "Palette key to map to" + ;; ,@(mapcar (lambda (x) + ;; (list 'const x)) + ;; (mapcar #'car (modus-themes--current-theme-palette))))))) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Palette overrides")) + + + +;;;; Presets of palette overrides + +(defvar modus-themes-preset-overrides-faint + '((bg-completion bg-inactive) + (bg-hl-line bg-dim) + (bg-paren-match bg-cyan-subtle) + (bg-region bg-active) + + (bg-mode-line-active bg-inactive) + (border-mode-line-active fg-dim) + (bg-mode-line-inactive bg-dim) + (border-mode-line-inactive bg-active) + + (bg-tab-bar bg-inactive) + (bg-tab-current bg-main) + (bg-tab-other bg-active) + + (fringe unspecified) + (builtin maroon) + (comment fg-dim) + (constant blue-faint) + (docstring fg-alt) + (docmarkup magenta-faint) + (fnname pink) + (keyword indigo) + (preprocessor rust) + (string slate) + (type cyan-faint) + (variable cyan-faint) + (rx-construct gold) + (rx-backslash olive) + + (underline-err red-faint) + (underline-warning yellow-faint) + (underline-note cyan-faint) + + (bg-button-active bg-main) + (fg-button-active fg-main) + (bg-button-inactive bg-inactive) + (fg-button-inactive "gray50") + + (date-common cyan-faint) + (date-deadline red-faint) + (date-event fg-alt) + (date-holiday magenta) + (date-now fg-main) + (date-scheduled yellow-faint) + (date-weekday fg-dim) + (date-weekend fg-dim) + + (name maroon) + (identifier fg-dim) + + (fg-line-number-active fg-main) + (fg-line-number-inactive "gray50") + (bg-line-number-active unspecified) + (bg-line-number-inactive unspecified) + + (fg-link blue-faint) + (bg-link unspecified) + (underline-link bg-active) + + (fg-link-symbolic cyan-faint) + (bg-link-symbolic unspecified) + (underline-link-symbolic bg-active) + + (fg-link-visited magenta-faint) + (bg-link-visited unspecified) + (underline-link-visited bg-active) + + (mail-cite-0 cyan-faint) + (mail-cite-1 yellow-faint) + (mail-cite-2 green-faint) + (mail-cite-3 red-faint) + (mail-part olive) + (mail-recipient indigo) + (mail-subject maroon) + (mail-other slate) + + (fg-prompt cyan-faint) + + (prose-code olive) + (prose-done green-faint) + (prose-macro indigo) + (prose-tag rust) + (prose-todo red-faint) + (prose-verbatim maroon) + + (rainbow-0 fg-main) + (rainbow-1 magenta) + (rainbow-2 cyan) + (rainbow-3 red-faint) + (rainbow-4 yellow-faint) + (rainbow-5 magenta-cooler) + (rainbow-6 green) + (rainbow-7 blue-warmer) + (rainbow-8 magenta-faint)) + "Preset for palette overrides with faint coloration. + +This changes many parts of the theme to make them look less +colorful/intense. Grays are toned down, gray backgrounds are +removed from some contexts, and almost all accent colors are +desaturated. + +All the preset overrides the themes provide (including this one): + +- `modus-themes-preset-overrides-faint' +- `modus-themes-preset-overrides-intense' +- `modus-themes-preset-overrides-cooler' +- `modus-themes-preset-overrides-warmer' + +To set a preset, assign its symbol without a quote as the value +of the `modus-themes-common-palette-overrides' or as the value of +theme-specific options such as `modus-operandi-palette-overrides'. + +For overriding named colors and/or semantic color mappings read +Info node `(modus-themes) Option for palette overrides'.") + +(defvar modus-themes-preset-overrides-intense + '((bg-region bg-cyan-intense) + + (bg-completion bg-cyan-subtle) + (bg-hover bg-yellow-intense) + (bg-hover-secondary bg-magenta-intense) + (bg-hl-line bg-cyan-subtle) + + (bg-mode-line-active bg-blue-subtle) + (fg-mode-line-active fg-main) + (border-mode-line-active blue-intense) + + (fringe bg-inactive) + (comment red-faint) + + (date-common cyan) + (date-deadline red) + (date-event blue) + (date-holiday magenta-warmer) + (date-now blue-faint) + (date-range blue) + (date-scheduled yellow-warmer) + (date-weekday fg-main) + (date-weekend red-faint) + + (keybind blue-intense) + + (mail-cite-0 blue) + (mail-cite-1 yellow) + (mail-cite-2 green) + (mail-cite-3 magenta) + (mail-part magenta-cooler) + (mail-recipient cyan) + (mail-subject red-warmer) + (mail-other cyan-cooler) + + (fg-prompt blue-intense) + + (prose-block red-faint) + (prose-done green-intense) + (prose-metadata magenta-faint) + (prose-metadata-value blue-cooler) + (prose-table blue) + (prose-todo red-intense) + + (fg-heading-0 blue-cooler) + (fg-heading-1 magenta-cooler) + (fg-heading-2 magenta-warmer) + (fg-heading-3 blue) + (fg-heading-4 cyan) + (fg-heading-5 green-warmer) + (fg-heading-6 yellow) + (fg-heading-7 red) + (fg-heading-8 magenta) + + (bg-heading-0 unspecified) + (bg-heading-1 bg-magenta-nuanced) + (bg-heading-2 bg-red-nuanced) + (bg-heading-3 bg-blue-nuanced) + (bg-heading-4 bg-cyan-nuanced) + (bg-heading-5 bg-green-nuanced) + (bg-heading-6 bg-yellow-nuanced) + (bg-heading-7 bg-red-nuanced) + (bg-heading-8 bg-magenta-nuanced) + + (overline-heading-0 unspecified) + (overline-heading-1 magenta-cooler) + (overline-heading-2 magenta-warmer) + (overline-heading-3 blue) + (overline-heading-4 cyan) + (overline-heading-5 green) + (overline-heading-6 yellow-cooler) + (overline-heading-7 red-cooler) + (overline-heading-8 magenta)) + "Preset for palette overrides with intense coloration. + +This changes many parts of the theme to make them look more +colorful/intense. Many background colors are accented and +coloration is increased to pop out more. + +All the preset overrides the themes provide (including this one): + +- `modus-themes-preset-overrides-faint' +- `modus-themes-preset-overrides-intense' +- `modus-themes-preset-overrides-cooler' +- `modus-themes-preset-overrides-warmer' + +To set a preset, assign its symbol without a quote as the value +of the `modus-themes-common-palette-overrides' or as the value of +theme-specific options such as `modus-operandi-palette-overrides'. + +For overriding named colors and/or semantic color mappings read +Info node `(modus-themes) Option for palette overrides'.") + +(defvar modus-themes-preset-overrides-cooler + '((fg-prompt blue-cooler) + + (builtin magenta-faint) + (constant blue-cooler) + (fnname cyan-cooler) + (keyword magenta-cooler) + (preprocessor blue) + (string blue-warmer) + (type green-cooler) + (variable cyan) + (rx-construct blue-cooler) + (rx-backslash red) + + (name blue-warmer) + (identifier magenta-faint) + + (date-deadline magenta-cooler) + (date-scheduled yellow-cooler) + (date-weekday blue-faint) + (date-weekend red-faint) + + (mail-cite-0 blue-faint) + (mail-cite-1 cyan-cooler) + (mail-cite-2 magenta-faint) + (mail-cite-3 yellow-cooler) + (mail-part cyan) + (mail-recipient blue-warmer) + (mail-subject magenta-cooler) + (mail-other blue) + + (prose-tag fg-dim) + (prose-verbatim blue-cooler)) + "Preset of palette overrides with cooler colors. + +This changes parts of the palette to use more blue and +blue-tinted colors. + +All the preset overrides the themes provide (including this one): + +- `modus-themes-preset-overrides-faint' +- `modus-themes-preset-overrides-intense' +- `modus-themes-preset-overrides-cooler' +- `modus-themes-preset-overrides-warmer' + +To set a preset, assign its symbol without a quote as the value +of the `modus-themes-common-palette-overrides' or as the value of +theme-specific options such as `modus-operandi-palette-overrides'. + +For overriding named colors and/or semantic color mappings read +Info node `(modus-themes) Option for palette overrides'.") + +(defvar modus-themes-preset-overrides-warmer + '((fg-prompt magenta-warmer) + + (builtin magenta) + (constant blue-warmer) + (fnname magenta-cooler) + (keyword magenta-warmer) + (preprocessor red-cooler) + (string green-warmer) + (type cyan-cooler) + (variable cyan) + (rx-construct blue-cooler) + (rx-backslash red-warmer) + + (name blue-warmer) + (identifier magenta) + (keybind magenta-warmer) + + (accent-0 magenta-warmer) + (accent-1 cyan) + (accent-2 blue-warmer) + (accent-3 red-cooler) + + (date-common cyan-cooler) + (date-holiday magenta-warmer) + + (mail-cite-0 magenta-faint) + (mail-cite-1 cyan-cooler) + (mail-cite-2 green-warmer) + (mail-cite-3 red-faint) + (mail-part cyan) + (mail-recipient magenta) + (mail-subject blue-warmer) + (mail-other magenta-warmer) + + (prose-macro red-cooler) + (prose-tag fg-dim)) + "Preset of palette overrides with warmer colors. + +This changes many parts of the theme to use warmer colors, +including green and yellow. + +All the preset overrides the themes provide (including this one): + +- `modus-themes-preset-overrides-faint' +- `modus-themes-preset-overrides-intense' +- `modus-themes-preset-overrides-cooler' +- `modus-themes-preset-overrides-warmer' + +To set a preset, assign its symbol without a quote as the value +of the `modus-themes-common-palette-overrides' or as the value of +theme-specific options such as `modus-operandi-palette-overrides'. + +For overriding named colors and/or semantic color mappings read +Info node `(modus-themes) Option for palette overrides'.") + + + +;;;; Helper functions for theme setup + +;; This is the WCAG formula: https://www.w3.org/TR/WCAG20-TECHS/G18.html +(defun modus-themes-wcag-formula (hex) + "Get WCAG value of color value HEX. +The value is defined in hexadecimal RGB notation, such #123456." + (cl-loop for k in '(0.2126 0.7152 0.0722) + for x in (color-name-to-rgb hex) + sum (* k (if (<= x 0.03928) + (/ x 12.92) + (expt (/ (+ x 0.055) 1.055) 2.4))))) + +;;;###autoload +(defun modus-themes-contrast (c1 c2) + "Measure WCAG contrast ratio between C1 and C2. +C1 and C2 are color values written in hexadecimal RGB." + (let ((ct (/ (+ (modus-themes-wcag-formula c1) 0.05) + (+ (modus-themes-wcag-formula c2) 0.05)))) + (max ct (/ ct)))) + +(make-obsolete 'modus-themes-color nil "4.0.0") +(make-obsolete 'modus-themes-color-alts nil "4.0.0") + +(declare-function cl-remove-if-not "cl-seq" (cl-pred cl-list &rest cl-keys)) + +(defun modus-themes--list-enabled-themes () + "Return list of `custom-enabled-themes' with modus- prefix." + (cl-remove-if-not + (lambda (theme) + (string-prefix-p "modus-" (symbol-name theme))) + custom-enabled-themes)) + +(defun modus-themes--enable-themes () + "Enable the Modus themes." + (mapc (lambda (theme) + (unless (memq theme custom-known-themes) + (load-theme theme :no-confirm :no-enable))) + modus-themes-items)) + +(defun modus-themes--list-known-themes () + "Return list of `custom-known-themes' with modus- prefix." + (modus-themes--enable-themes) + (cl-remove-if-not + (lambda (theme) + (string-prefix-p "modus-" (symbol-name theme))) + custom-known-themes)) + +(defun modus-themes--current-theme () + "Return first enabled Modus theme." + (car (or (modus-themes--list-enabled-themes) + (modus-themes--list-known-themes)))) + +(defun modus-themes--palette-symbol (theme &optional overrides) + "Return THEME palette as a symbol. +With optional OVERRIDES, return THEME palette overrides as a +symbol." + (when-let ((suffix (cond + ((and theme overrides) + "palette-overrides") + (theme + "palette")))) + (intern (format "%s-%s" theme suffix)))) + +(defun modus-themes--palette-value (theme &optional overrides) + "Return palette value of THEME with optional OVERRIDES." + (let ((base-value (symbol-value (modus-themes--palette-symbol theme)))) + (if overrides + (append (symbol-value (modus-themes--palette-symbol theme :overrides)) + modus-themes-common-palette-overrides + base-value) + base-value))) + +(defun modus-themes--current-theme-palette (&optional overrides) + "Return palette value of active Modus theme, else produce `user-error'. +With optional OVERRIDES return palette value plus whatever +overrides." + (if-let ((theme (modus-themes--current-theme))) + (if overrides + (modus-themes--palette-value theme :overrides) + (modus-themes--palette-value theme)) + (user-error "No enabled Modus theme could be found"))) + +(defun modus-themes--disable-themes () + "Disable themes per `modus-themes-disable-other-themes'." + (mapc #'disable-theme + (if modus-themes-disable-other-themes + custom-enabled-themes + (modus-themes--list-known-themes)))) + +(defun modus-themes-load-theme (theme) + "Load THEME while disabling other themes. + +Which themes are disabled is determined by the user option +`modus-themes-disable-other-themes'. + +Run the `modus-themes-after-load-theme-hook' as the final step +after loading the THEME. + +Return THEME." + (modus-themes--disable-themes) + (load-theme theme :no-confirm) + (run-hooks 'modus-themes-after-load-theme-hook) + theme) + +(defun modus-themes--retrieve-palette-value (color palette) + "Return COLOR from PALETTE. +Use recursion until COLOR is retrieved as a string. Refrain from +doing so if the value of COLOR is not a key in the PALETTE. + +Return `unspecified' if the value of COLOR cannot be determined. +This symbol is accepted by faces and is thus harmless. + +This function is used in the macros `modus-themes-theme', +`modus-themes-with-colors'." + (let ((value (car (alist-get color palette)))) + (cond + ((or (stringp value) + (eq value 'unspecified)) + value) + ((and (symbolp value) + (memq value (mapcar #'car palette))) + (modus-themes--retrieve-palette-value value palette)) + (t + 'unspecified)))) + +(defun modus-themes-get-color-value (color &optional overrides theme) + "Return color value of named COLOR for current Modus theme. + +COLOR is a symbol that represents a named color entry in the +palette. + +If the value is the name of another color entry in the +palette (so a mapping), recur until you find the underlying color +value. + +With optional OVERRIDES as a non-nil value, account for palette +overrides. Else use the default palette. + +With optional THEME as a symbol among `modus-themes-items', use +the palette of that item. Else use the current Modus theme. + +If COLOR is not present in the palette, return the `unspecified' +symbol, which is safe when used as a face attribute's value." + (if-let* ((palette (if theme + (modus-themes--palette-value theme overrides) + (modus-themes--current-theme-palette overrides))) + (value (modus-themes--retrieve-palette-value color palette))) + value + 'unspecified)) + +;;;; Commands + +(make-obsolete 'modus-themes-load-themes nil "4.0.0") +(make-obsolete 'modus-themes-load-operandi nil "4.0.0; Check `modus-themes-load-theme'") +(make-obsolete 'modus-themes-load-vivendi nil "4.0.0; Check `modus-themes-load-theme'") + +(defvar modus-themes--select-theme-history nil + "Minibuffer history of `modus-themes--select-prompt'.") + +(defun modus-themes--annotate-theme (theme) + "Return completion annotation for THEME." + (when-let ((symbol (intern-soft theme)) + (doc-string (get symbol 'theme-documentation))) + (format " -- %s" (car (split-string doc-string "\\."))))) + +(defun modus-themes--completion-table (category candidates) + "Pass appropriate metadata CATEGORY to completion CANDIDATES." + (lambda (string pred action) + (if (eq action 'metadata) + `(metadata (category . ,category)) + (complete-with-action action candidates string pred)))) + +(defun modus-themes--completion-table-candidates () + "Render `modus-themes--list-known-themes' as completion with theme category." + (modus-themes--completion-table 'theme (modus-themes--list-known-themes))) + +(defun modus-themes--select-prompt () + "Minibuffer prompt to select a Modus theme." + (let ((completion-extra-properties `(:annotation-function ,#'modus-themes--annotate-theme))) + (intern + (completing-read + "Select Modus theme: " + (modus-themes--completion-table-candidates) + nil t nil + 'modus-themes--select-theme-history)))) + +;;;###autoload +(defun modus-themes-select (theme) + "Load a Modus THEME using minibuffer completion. +Run `modus-themes-after-load-theme-hook' after loading the theme. +Disable other themes per `modus-themes-disable-other-themes'." + (interactive (list (modus-themes--select-prompt))) + (modus-themes-load-theme theme)) + +(defun modus-themes--toggle-theme-p () + "Return non-nil if `modus-themes-to-toggle' are valid." + (mapc + (lambda (theme) + (if (or (memq theme modus-themes-items) + (memq theme (modus-themes--list-known-themes))) + theme + (user-error "`%s' is not part of `modus-themes-items'" theme))) + modus-themes-to-toggle)) + +;;;###autoload +(defun modus-themes-toggle () + "Toggle between the two `modus-themes-to-toggle'. +If `modus-themes-to-toggle' does not specify two Modus themes, +prompt with completion for a theme among our collection (this is +practically the same as the `modus-themes-select' command). + +Run `modus-themes-after-load-theme-hook' after loading the theme. +Disable other themes per `modus-themes-disable-other-themes'." + (interactive) + (if-let* ((themes (modus-themes--toggle-theme-p)) + (one (car themes)) + (two (cadr themes))) + (modus-themes-load-theme (if (eq (car custom-enabled-themes) one) two one)) + (modus-themes-load-theme (modus-themes--select-prompt)))) + +(defun modus-themes--list-colors-render (buffer theme &optional mappings &rest _) + "Render colors in BUFFER from THEME for `modus-themes-list-colors'. +Optional MAPPINGS changes the output to only list the semantic +color mappings of the palette, instead of its named colors." + (let* ((current-palette (modus-themes--palette-value theme mappings)) + (palette (if mappings + (seq-remove (lambda (cell) + (stringp (cadr cell))) + current-palette) + current-palette)) + (current-buffer buffer) + (current-theme theme)) + (with-help-window buffer + (with-current-buffer standard-output + (erase-buffer) + (when (<= (display-color-cells) 256) + (insert (concat "Your display terminal may not render all color previews!\n" + "It seems to only support <= 256 colors.\n\n")) + (put-text-property (point-min) (point) 'face 'warning)) + ;; We need this to properly render the first line. + (insert " ") + (dolist (cell palette) + (let* ((name (car cell)) + (color (modus-themes-get-color-value name mappings theme)) + (pad (make-string 10 ?\s)) + (fg (if (eq color 'unspecified) + (progn + (readable-foreground-color (modus-themes-get-color-value 'bg-main nil theme)) + (setq pad (make-string 6 ?\s))) + (readable-foreground-color color)))) + (let ((old-point (point))) + (insert (format "%s %s" color pad)) + (put-text-property old-point (point) 'face `( :foreground ,color))) + (let ((old-point (point))) + (insert (format " %s %s %s\n" color pad name)) + (put-text-property old-point (point) + 'face `( :background ,color + :foreground ,fg + :extend t))) + ;; We need this to properly render the last line. + (insert " "))) + (setq-local revert-buffer-function + (lambda (_ignore-auto _noconfirm) + (modus-themes--list-colors-render current-buffer current-theme mappings))))))) + +(defvar modus-themes--list-colors-prompt-history '() + "Minibuffer history for `modus-themes--list-colors-prompt'.") + +(defun modus-themes--list-colors-prompt () + "Prompt for Modus theme. +Helper function for `modus-themes-list-colors'." + (let ((def (format "%s" (modus-themes--current-theme))) + (completion-extra-properties `(:annotation-function ,#'modus-themes--annotate-theme))) + (completing-read + (format "Use palette from theme [%s]: " def) + (modus-themes--completion-table-candidates) + nil t nil + 'modus-themes--list-colors-prompt-history def))) + +(defun modus-themes-list-colors (theme &optional mappings) + "Preview named colors of the Modus THEME of choice. +With optional prefix argument for MAPPINGS preview the semantic +color mappings instead of the named colors." + (interactive (list (intern (modus-themes--list-colors-prompt)) current-prefix-arg)) + (modus-themes--list-colors-render + (format (if mappings "*%s-list-mappings*" "*%s-list-colors*") theme) + theme + mappings)) + +(defalias 'modus-themes-preview-colors 'modus-themes-list-colors + "Alias of `modus-themes-list-colors'.") + +(defun modus-themes-list-colors-current (&optional mappings) + "Call `modus-themes-list-colors' for the current Modus theme. +Optional prefix argument MAPPINGS has the same meaning as for +`modus-themes-list-colors'." + (interactive "P") + (modus-themes-list-colors (modus-themes--current-theme) mappings)) + +(defalias 'modus-themes-preview-colors-current 'modus-themes-list-colors-current + "Alias of `modus-themes-list-colors-current'.") + + + +;;;; Internal functions + +(defun modus-themes--warn (option) + "Warn that OPTION has changed." + (prog1 nil + (display-warning + 'modus-themes + (format "`%s' has changed; please read the updated documentation" option) + :warning))) + +(defun modus-themes--list-or-warn (option) + "Return list or nil value of OPTION, else `modus-themes--warn'." + (let* ((value (symbol-value option))) + (if (or (null value) (listp value)) + value + (modus-themes--warn option)))) + +(defun modus-themes--property-lookup (properties alist-key list-pred default) + "Return value from property alist or list. +Check PROPERTIES for an alist value that corresponds to +ALIST-KEY. If no alist is present, search the PROPERTIES +list given LIST-PRED, using DEFAULT as a fallback." + (if-let* ((val (or (alist-get alist-key properties) + (cl-loop for x in properties + if (funcall list-pred x) return x) + default)) + ((listp val))) + (car val) + val)) + +;; Helper functions that are meant to ease the implementation of the +;; above customization variables. +(defun modus-themes--bold-weight () + "Conditional use of a heavier text weight." + (when modus-themes-bold-constructs + (list :inherit 'bold))) + +(defun modus-themes--slant () + "Conditional use of italics for slant attribute." + (when modus-themes-italic-constructs + (list :inherit 'italic))) + +(defun modus-themes--fixed-pitch () + "Conditional application of `fixed-pitch' inheritance." + (when modus-themes-mixed-fonts + (list :inherit 'fixed-pitch))) + +(defun modus-themes--variable-pitch-ui () + "Conditional use of `variable-pitch' in UI elements." + (when modus-themes-variable-pitch-ui + (list :inherit 'variable-pitch))) + +(defun modus-themes--prompt (fg bg) + "Conditional use of colors for text prompt faces. +FG is the prompt's standard foreground. BG is a background +color that is combined with FG-FOR-BG." + (let* ((properties (modus-themes--list-or-warn 'modus-themes-prompts)) + (weight (modus-themes--weight properties))) + (list :inherit + (cond + ((and (memq 'bold properties) + (memq 'italic properties)) + 'bold-italic) + ((memq 'italic properties) + 'italic) + ((memq 'bold properties) + 'bold) + ('unspecified)) + :background bg + :foreground fg + :weight + ;; If we have `bold' specifically, we inherit the face of + ;; the same name. This allows the user to customise that + ;; face, such as to change its font family. + (if (and weight (not (eq weight 'bold))) + weight + 'unspecified)))) + +(defconst modus-themes-weights + '( thin ultralight extralight light semilight regular medium + semibold bold heavy extrabold ultrabold) + "List of font weights.") + +(defun modus-themes--weight (list) + "Search for `modus-themes-weights' weight in LIST." + (catch 'found + (dolist (elt list) + (when (memq elt modus-themes-weights) + (throw 'found elt))))) + +(defun modus-themes--heading (level fg &optional bg ol) + "Conditional styles for `modus-themes-headings'. + +LEVEL is the heading's position in their order. FG is the +default text color. Optional BG is an appropriate background. +Optional OL is the color of an overline." + (let* ((key (alist-get level modus-themes-headings)) + (style (or key (alist-get t modus-themes-headings))) + (style-listp (listp style)) + (properties style) + (var (when (and style-listp (memq 'variable-pitch properties)) 'variable-pitch)) + (weight (when style-listp (modus-themes--weight style)))) + (list :inherit (cond + ((not style-listp) 'bold) + ;; `no-bold' is for backward compatibility because we cannot + ;; deprecate a variable's value. + ((or weight (memq 'no-bold properties)) + var) + (var (append (list 'bold) (list var))) + (t 'bold)) + :background (or bg 'unspecified) + :foreground fg + :overline (or ol 'unspecified) + :height (if style-listp + (modus-themes--property-lookup properties 'height #'floatp 'unspecified) + 'unspecified) + :weight (or weight 'unspecified)))) + +(defun modus-themes--org-block (fg bg) + "Conditionally set the FG and BG of Org blocks." + (let ((gray (or (eq modus-themes-org-blocks 'gray-background) + (eq modus-themes-org-blocks 'grayscale) ; for backward compatibility + (eq modus-themes-org-blocks 'greyscale)))) + (list :inherit 'modus-themes-fixed-pitch + :background (if gray bg 'unspecified) + :foreground (if gray 'unspecified fg) + :extend (if gray t 'unspecified)))) + +(defun modus-themes--completion-line (bg) + "Styles for `modus-themes-completions' with BG as the background." + (let* ((var (modus-themes--list-or-warn 'modus-themes-completions)) + (properties (or (alist-get 'selection var) (alist-get t var))) + (italic (memq 'italic properties)) + (weight (modus-themes--weight properties)) + (bold (when (and weight (eq weight 'bold)) 'bold))) + (list + :inherit + (cond + ((and italic weight (not (eq weight 'bold))) + 'italic) + ((and weight (not (eq weight 'bold))) + 'unspecified) + (italic 'bold-italic) + ('bold)) + :background bg + :foreground 'unspecified + :underline + (if (memq 'underline properties) t 'unspecified) + :weight + (if (and weight (null bold)) weight 'unspecified)))) + +(defun modus-themes--completion-match (fg bg) + "Styles for `modus-themes-completions'. +FG and BG are the main colors." + (let* ((var (modus-themes--list-or-warn 'modus-themes-completions)) + (properties (or (alist-get 'matches var) (alist-get t var))) + (italic (memq 'italic properties)) + (weight (modus-themes--weight properties)) + (bold (when (and weight (eq weight 'bold)) 'bold))) + (list + :inherit + (cond + ((and italic weight (not (eq weight 'bold))) + 'italic) + ((and weight (not (eq weight 'bold))) + 'unspecified) + (italic 'bold-italic) + ('bold)) + :background bg + :foreground fg + :underline + (if (memq 'underline properties) t 'unspecified) + :weight + (if (and weight (null bold)) weight 'unspecified)))) + + + +;;;; Face specifications + +(defconst modus-themes-faces + '( +;;;; custom faces + ;; these bespoke faces are inherited by other constructs below +;;;;; just the foregrounds + `(modus-themes-fg-red ((,c :foreground ,red))) + `(modus-themes-fg-red-warmer ((,c :foreground ,red-warmer))) + `(modus-themes-fg-red-cooler ((,c :foreground ,red-cooler))) + `(modus-themes-fg-red-faint ((,c :foreground ,red-faint))) + `(modus-themes-fg-red-intense ((,c :foreground ,red-intense))) + `(modus-themes-fg-green ((,c :foreground ,green))) + `(modus-themes-fg-green-warmer ((,c :foreground ,green-warmer))) + `(modus-themes-fg-green-cooler ((,c :foreground ,green-cooler))) + `(modus-themes-fg-green-faint ((,c :foreground ,green-faint))) + `(modus-themes-fg-green-intense ((,c :foreground ,green-intense))) + `(modus-themes-fg-yellow ((,c :foreground ,yellow))) + `(modus-themes-fg-yellow-warmer ((,c :foreground ,yellow-warmer))) + `(modus-themes-fg-yellow-cooler ((,c :foreground ,yellow-cooler))) + `(modus-themes-fg-yellow-faint ((,c :foreground ,yellow-faint))) + `(modus-themes-fg-yellow-intense ((,c :foreground ,yellow-intense))) + `(modus-themes-fg-blue ((,c :foreground ,blue))) + `(modus-themes-fg-blue-warmer ((,c :foreground ,blue-warmer))) + `(modus-themes-fg-blue-cooler ((,c :foreground ,blue-cooler))) + `(modus-themes-fg-blue-faint ((,c :foreground ,blue-faint))) + `(modus-themes-fg-blue-intense ((,c :foreground ,blue-intense))) + `(modus-themes-fg-magenta ((,c :foreground ,magenta))) + `(modus-themes-fg-magenta-warmer ((,c :foreground ,magenta-warmer))) + `(modus-themes-fg-magenta-cooler ((,c :foreground ,magenta-cooler))) + `(modus-themes-fg-magenta-faint ((,c :foreground ,magenta-faint))) + `(modus-themes-fg-magenta-intense ((,c :foreground ,magenta-intense))) + `(modus-themes-fg-cyan ((,c :foreground ,cyan))) + `(modus-themes-fg-cyan-warmer ((,c :foreground ,cyan-warmer))) + `(modus-themes-fg-cyan-cooler ((,c :foreground ,cyan-cooler))) + `(modus-themes-fg-cyan-faint ((,c :foreground ,cyan-faint))) + `(modus-themes-fg-cyan-intense ((,c :foreground ,cyan-intense))) +;;;;; nuanced colored backgrounds + `(modus-themes-nuanced-red ((,c :background ,bg-red-nuanced :extend t))) + `(modus-themes-nuanced-green ((,c :background ,bg-green-nuanced :extend t))) + `(modus-themes-nuanced-yellow ((,c :background ,bg-yellow-nuanced :extend t))) + `(modus-themes-nuanced-blue ((,c :background ,bg-blue-nuanced :extend t))) + `(modus-themes-nuanced-magenta ((,c :background ,bg-magenta-nuanced :extend t))) + `(modus-themes-nuanced-cyan ((,c :background ,bg-cyan-nuanced :extend t))) +;;;;; subtle colored backgrounds + `(modus-themes-subtle-red ((,c :background ,bg-red-subtle :foreground ,fg-main))) + `(modus-themes-subtle-green ((,c :background ,bg-green-subtle :foreground ,fg-main))) + `(modus-themes-subtle-yellow ((,c :background ,bg-yellow-subtle :foreground ,fg-main))) + `(modus-themes-subtle-blue ((,c :background ,bg-blue-subtle :foreground ,fg-main))) + `(modus-themes-subtle-magenta ((,c :background ,bg-magenta-subtle :foreground ,fg-main))) + `(modus-themes-subtle-cyan ((,c :background ,bg-cyan-subtle :foreground ,fg-main))) +;;;;; intense colored backgrounds + `(modus-themes-intense-red ((,c :background ,bg-red-intense :foreground ,fg-main))) + `(modus-themes-intense-green ((,c :background ,bg-green-intense :foreground ,fg-main))) + `(modus-themes-intense-yellow ((,c :background ,bg-yellow-intense :foreground ,fg-main))) + `(modus-themes-intense-blue ((,c :background ,bg-blue-intense :foreground ,fg-main))) + `(modus-themes-intense-magenta ((,c :background ,bg-magenta-intense :foreground ,fg-main))) + `(modus-themes-intense-cyan ((,c :background ,bg-cyan-intense :foreground ,fg-main))) +;;;;; mark indicators + ;; color combinations intended for Dired, Ibuffer, or equivalent + `(modus-themes-mark-alt ((,c :inherit bold :background ,bg-mark-other :foreground ,fg-mark-other))) + `(modus-themes-mark-del ((,c :inherit bold :background ,bg-mark-delete :foreground ,fg-mark-delete))) + `(modus-themes-mark-sel ((,c :inherit bold :background ,bg-mark-select :foreground ,fg-mark-select))) +;;;;; heading levels + ;; styles for regular headings used in Org, Markdown, Info, etc. + `(modus-themes-heading-0 ((,c ,@(modus-themes--heading 0 fg-heading-0 bg-heading-0 overline-heading-0)))) + `(modus-themes-heading-1 ((,c ,@(modus-themes--heading 1 fg-heading-1 bg-heading-1 overline-heading-1)))) + `(modus-themes-heading-2 ((,c ,@(modus-themes--heading 2 fg-heading-2 bg-heading-2 overline-heading-2)))) + `(modus-themes-heading-3 ((,c ,@(modus-themes--heading 3 fg-heading-3 bg-heading-3 overline-heading-3)))) + `(modus-themes-heading-4 ((,c ,@(modus-themes--heading 4 fg-heading-4 bg-heading-4 overline-heading-4)))) + `(modus-themes-heading-5 ((,c ,@(modus-themes--heading 5 fg-heading-5 bg-heading-5 overline-heading-5)))) + `(modus-themes-heading-6 ((,c ,@(modus-themes--heading 6 fg-heading-6 bg-heading-6 overline-heading-6)))) + `(modus-themes-heading-7 ((,c ,@(modus-themes--heading 7 fg-heading-7 bg-heading-7 overline-heading-7)))) + `(modus-themes-heading-8 ((,c ,@(modus-themes--heading 8 fg-heading-8 bg-heading-8 overline-heading-8)))) +;;;;; language checkers + `(modus-themes-lang-error ((,c :underline (:style wave :color ,underline-err)))) + `(modus-themes-lang-note ((,c :underline (:style wave :color ,underline-note)))) + `(modus-themes-lang-warning ((,c :underline (:style wave :color ,underline-warning)))) +;;;;; prominent semantic notes + `(modus-themes-prominent-error ((,c :background ,bg-prominent-err :foreground ,fg-prominent-err))) + `(modus-themes-prominent-note ((,c :background ,bg-prominent-note :foreground ,fg-prominent-note))) + `(modus-themes-prominent-warning ((,c :background ,bg-prominent-warning :foreground ,fg-prominent-warning))) +;;;;; markup + `(modus-themes-prose-code ((,c :inherit modus-themes-fixed-pitch :foreground ,prose-code))) + `(modus-themes-prose-macro ((,c :inherit modus-themes-fixed-pitch :foreground ,prose-macro))) + `(modus-themes-prose-verbatim ((,c :inherit modus-themes-fixed-pitch :foreground ,prose-verbatim))) +;;;;; search + `(modus-themes-search-current ((,c :background ,bg-yellow-intense :foreground ,fg-main))) + `(modus-themes-search-lazy ((,c :background ,bg-cyan-intense :foreground ,fg-main))) +;;;;; completion frameworks + `(modus-themes-completion-match-0 ((,c ,@(modus-themes--completion-match fg-completion-match-0 bg-completion-match-0)))) + `(modus-themes-completion-match-1 ((,c ,@(modus-themes--completion-match fg-completion-match-1 bg-completion-match-1)))) + `(modus-themes-completion-match-2 ((,c ,@(modus-themes--completion-match fg-completion-match-2 bg-completion-match-2)))) + `(modus-themes-completion-match-3 ((,c ,@(modus-themes--completion-match fg-completion-match-3 bg-completion-match-3)))) + `(modus-themes-completion-selected ((,c ,@(modus-themes--completion-line bg-completion)))) +;;;;; typography + `(modus-themes-bold ((,c ,@(modus-themes--bold-weight)))) + `(modus-themes-fixed-pitch ((,c ,@(modus-themes--fixed-pitch)))) + `(modus-themes-slant ((,c ,@(modus-themes--slant)))) + `(modus-themes-ui-variable-pitch ((,c ,@(modus-themes--variable-pitch-ui)))) +;;;;; other custom faces + `(modus-themes-button ((,c :inherit variable-pitch + :box (:line-width 1 :color ,border :style released-button) + :background ,bg-button-active + :foreground ,fg-button-active))) + `(modus-themes-key-binding ((,c :inherit (bold modus-themes-fixed-pitch) :foreground ,keybind))) + `(modus-themes-prompt ((,c ,@(modus-themes--prompt fg-prompt bg-prompt)))) + `(modus-themes-reset-soft ((,c :background ,bg-main :foreground ,fg-main + :weight normal :slant normal :strike-through nil + :box nil :underline nil :overline nil :extend nil))) +;;;; standard faces +;;;;; absolute essentials + `(default ((,c :background ,bg-main :foreground ,fg-main))) + `(cursor ((,c :background ,cursor))) + `(fringe ((,c :background ,fringe :foreground ,fg-main))) + `(menu ((,c :background ,bg-dim :foreground ,fg-main))) + `(scroll-bar ((,c :background ,bg-dim :foreground ,fg-dim))) + `(tool-bar ((,c :background ,bg-dim :foreground ,fg-main))) + `(vertical-border ((,c :foreground ,border))) +;;;;; basic and/or ungrouped styles + `(appt-notification ((,c :inherit error))) + `(blink-matching-paren-highlight-offscreen ((,c :background ,bg-paren-match))) + `(bold ((,c :weight bold))) + `(bold-italic ((,c :inherit (bold italic)))) + `(underline ((,c :underline ,fg-dim))) + `(buffer-menu-buffer ((,c :inherit bold))) + `(child-frame-border ((,c :background ,border))) + `(comint-highlight-input ((,c :inherit bold))) + `(comint-highlight-prompt ((,c :inherit modus-themes-prompt))) + `(confusingly-reordered ((,c :inherit modus-themes-lang-error))) + `(edmacro-label ((,c :inherit bold :foreground ,accent-0))) + `(elisp-shorthand-font-lock-face ((,c :inherit font-lock-variable-name-face))) + `(error ((,c :inherit bold :foreground ,err))) + `(escape-glyph ((,c :foreground ,err))) + `(file-name-shadow ((,c :inherit shadow))) + `(header-line ((,c :inherit modus-themes-ui-variable-pitch :background ,bg-dim))) + `(header-line-highlight ((,c :inherit highlight))) + `(help-argument-name ((,c :inherit modus-themes-slant :foreground ,variable))) + `(help-key-binding ((,c :inherit modus-themes-key-binding))) + `(highlight ((,c :background ,bg-hover :foreground ,fg-main))) + `(homoglyph ((,c :foreground ,warning))) + `(ibuffer-locked-buffer ((,c :foreground ,warning))) + `(icon-button ((,c :inherit modus-themes-button))) + `(italic ((,c :slant italic))) + `(nobreak-hyphen ((,c :foreground ,err))) + `(nobreak-space ((,c :foreground ,err :underline t))) + `(menu ((,c :inverse-video unspecified :background ,bg-active :foreground ,fg-main))) + `(minibuffer-prompt ((,c :inherit modus-themes-prompt))) + `(mm-command-output ((,c :foreground ,mail-part))) + `(mm-uu-extract ((,c :foreground ,mail-part))) + `(next-error ((,c :inherit modus-themes-prominent-error :extend t))) + `(pgtk-im-0 ((,c :inherit modus-themes-prominent-note))) + `(read-multiple-choice-face ((,c :inherit (bold modus-themes-mark-alt)))) + `(rectangle-preview ((,c :inherit secondary-selection))) + `(region ((,c :background ,bg-region :foreground ,fg-region))) + `(secondary-selection ((,c :background ,bg-hover-secondary :foreground ,fg-main))) + `(separator-line ((,c :underline ,bg-active))) + `(shadow ((,c :foreground ,fg-dim))) + `(success ((,c :inherit bold :foreground ,info))) + `(trailing-whitespace ((,c :background ,bg-space-err))) + `(warning ((,c :inherit bold :foreground ,warning))) +;;;;; buttons, links, widgets + `(button ((,c :background ,bg-link :foreground ,fg-link :underline ,underline-link))) + `(link ((,c :inherit button))) + `(link-visited ((,c :background ,bg-link-visited :foreground ,fg-link-visited :underline ,underline-link-visited))) + `(tooltip ((,c :background ,bg-active :foreground ,fg-main))) +;;;;; agda2-mode + `(agda2-highlight-bound-variable-face ((,c :inherit font-lock-variable-name-face))) + `(agda2-highlight-catchall-clause-face ((,c :background ,bg-inactive))) + `(agda2-highlight-coinductive-constructor-face ((,c :inherit font-lock-type-face))) + `(agda2-highlight-coverage-problem-face ((,c :inherit modus-themes-lang-error))) + `(agda2-highlight-datatype-face ((,c :inherit font-lock-type-face))) + `(agda2-highlight-deadcode-face ((,c :background ,bg-active))) + `(agda2-highlight-dotted-face ((,c :inherit font-lock-variable-name-face))) + `(agda2-highlight-error-face ((,c :inherit modus-themes-lang-error))) + `(agda2-highlight-field-face ((,c :inherit font-lock-type-face))) + `(agda2-highlight-function-face ((,c :inherit font-lock-function-name-face))) + `(agda2-highlight-generalizable-variable-face ((,c :inherit font-lock-variable-name-face))) + `(agda2-highlight-incomplete-pattern-face ((,c :inherit modus-themes-lang-warning))) + `(agda2-highlight-inductive-constructor-face ((,c :inherit font-lock-type-face))) + `(agda2-highlight-keyword-face ((,c :inherit font-lock-keyword-face))) + `(agda2-highlight-macro-face ((,c :inherit font-lock-keyword-face))) + `(agda2-highlight-module-face ((,c :inherit font-lock-variable-name-face))) + `(agda2-highlight-number-face ((,c :inherit shadow))) + `(agda2-highlight-operator-face ((,c :inherit font-lock-variable-name-face))) + `(agda2-highlight-positivity-problem-face ((,c :inherit modus-themes-lang-warning))) + `(agda2-highlight-postulate-face ((,c :inherit font-lock-type-face))) + `(agda2-highlight-pragma-face ((,c :inherit font-lock-preprocessor-face))) + `(agda2-highlight-primitive-face ((,c :inherit font-lock-type-face))) + `(agda2-highlight-primitive-type-face ((,c :inherit font-lock-type-face))) + `(agda2-highlight-record-face ((,c :inherit font-lock-type-face))) + `(agda2-highlight-string-face ((,c :inherit font-lock-string-face))) + `(agda2-highlight-symbol-face ((,c :inherit font-lock-constant-face))) + `(agda2-highlight-termination-problem-face ((,c :inherit modus-themes-lang-warning))) + `(agda2-highlight-typechecks-face ((,c :inherit font-lock-warning-face))) + `(agda2-highlight-unsolved-constraint-face ((,c :inherit modus-themes-lang-warning))) + `(agda2-highlight-unsolved-meta-face ((,c :inherit modus-themes-lang-warning))) +;;;;; all-the-icons + `(all-the-icons-blue ((,c :foreground ,blue-cooler))) + `(all-the-icons-blue-alt ((,c :foreground ,blue-warmer))) + `(all-the-icons-cyan ((,c :foreground ,cyan))) + `(all-the-icons-cyan-alt ((,c :foreground ,cyan-warmer))) + `(all-the-icons-dblue ((,c :foreground ,blue-faint))) + `(all-the-icons-dcyan ((,c :foreground ,cyan-faint))) + `(all-the-icons-dgreen ((,c :foreground ,green-faint))) + `(all-the-icons-dmaroon ((,c :foreground ,magenta-faint))) + `(all-the-icons-dorange ((,c :foreground ,red-faint))) + `(all-the-icons-dpink ((,c :foreground ,magenta-faint))) + `(all-the-icons-dpurple ((,c :foreground ,magenta-cooler))) + `(all-the-icons-dred ((,c :foreground ,red))) + `(all-the-icons-dsilver ((,c :foreground ,cyan-faint))) + `(all-the-icons-dyellow ((,c :foreground ,yellow-faint))) + `(all-the-icons-green ((,c :foreground ,green))) + `(all-the-icons-lblue ((,c :foreground ,blue-cooler))) + `(all-the-icons-lcyan ((,c :foreground ,cyan))) + `(all-the-icons-lgreen ((,c :foreground ,green-warmer))) + `(all-the-icons-lmaroon ((,c :foreground ,magenta-warmer))) + `(all-the-icons-lorange ((,c :foreground ,red-warmer))) + `(all-the-icons-lpink ((,c :foreground ,magenta))) + `(all-the-icons-lpurple ((,c :foreground ,magenta-faint))) + `(all-the-icons-lred ((,c :foreground ,red-faint))) + `(all-the-icons-lsilver ((,c :foreground "gray50"))) + `(all-the-icons-lyellow ((,c :foreground ,yellow-warmer))) + `(all-the-icons-maroon ((,c :foreground ,magenta))) + `(all-the-icons-orange ((,c :foreground ,yellow-warmer))) + `(all-the-icons-pink ((,c :foreground ,magenta-warmer))) + `(all-the-icons-purple ((,c :foreground ,magenta-cooler))) + `(all-the-icons-purple-alt ((,c :foreground ,blue-warmer))) + `(all-the-icons-red ((,c :foreground ,red))) + `(all-the-icons-red-alt ((,c :foreground ,red-cooler))) + `(all-the-icons-silver ((,c :foreground "gray50"))) + `(all-the-icons-yellow ((,c :foreground ,yellow))) +;;;;; all-the-icons-dired + `(all-the-icons-dired-dir-face ((,c :foreground ,cyan-faint))) +;;;;; all-the-icons-ibuffer + `(all-the-icons-ibuffer-dir-face ((,c :foreground ,cyan-faint))) + `(all-the-icons-ibuffer-file-face ((,c :foreground ,blue-faint))) + `(all-the-icons-ibuffer-mode-face ((,c :foreground ,cyan))) + `(all-the-icons-ibuffer-size-face ((,c :foreground ,cyan-cooler))) +;;;;; annotate + `(annotate-annotation ((,c :inherit modus-themes-subtle-blue))) + `(annotate-annotation-secondary ((,c :inherit modus-themes-subtle-magenta))) + `(annotate-highlight ((,c :background ,bg-blue-subtle :underline ,blue-intense))) + `(annotate-highlight-secondary ((,c :background ,bg-magenta-subtle :underline ,magenta-intense))) +;;;;; ansi-color + ;; Those are in Emacs28. + `(ansi-color-black ((,c :background ,bg-term-black :foreground ,fg-term-black))) + `(ansi-color-blue ((,c :background ,bg-term-blue :foreground ,fg-term-blue))) + `(ansi-color-bold ((,c :inherit bold))) + `(ansi-color-bright-black ((,c :background ,bg-term-black-bright :foreground ,fg-term-black-bright))) + `(ansi-color-bright-blue ((,c :background ,bg-term-blue-bright :foreground ,fg-term-blue-bright))) + `(ansi-color-bright-cyan ((,c :background ,bg-term-cyan-bright :foreground ,fg-term-cyan-bright))) + `(ansi-color-bright-green ((,c :background ,bg-term-green-bright :foreground ,fg-term-green-bright))) + `(ansi-color-bright-magenta ((,c :background ,bg-term-magenta-bright :foreground ,fg-term-magenta-bright))) + `(ansi-color-bright-red ((,c :background ,bg-term-red-bright :foreground ,fg-term-red-bright))) + `(ansi-color-bright-white ((,c :background ,bg-term-white-bright :foreground ,fg-term-white-bright))) + `(ansi-color-bright-yellow ((,c :background ,bg-term-yellow-bright :foreground ,fg-term-yellow-bright))) + `(ansi-color-cyan ((,c :background ,bg-term-cyan :foreground ,fg-term-cyan))) + `(ansi-color-green ((,c :background ,bg-term-green :foreground ,fg-term-green))) + `(ansi-color-magenta ((,c :background ,bg-term-magenta :foreground ,fg-term-magenta))) + `(ansi-color-red ((,c :background ,bg-term-red :foreground ,fg-term-red))) + `(ansi-color-white ((,c :background ,bg-term-white :foreground ,fg-term-white))) + `(ansi-color-yellow ((,c :background ,bg-term-yellow :foreground ,fg-term-yellow))) +;;;;; anzu + `(anzu-match-1 ((,c :inherit modus-themes-subtle-cyan))) + `(anzu-match-2 ((,c :inherit modus-themes-search-current))) + `(anzu-match-3 ((,c :inherit modus-themes-subtle-yellow))) + `(anzu-mode-line ((,c :inherit bold))) + `(anzu-mode-line-no-match ((,c :inherit error))) + `(anzu-replace-highlight ((,c :inherit modus-themes-prominent-error :underline t))) + `(anzu-replace-to ((,c :inherit modus-themes-search-current))) +;;;;; auctex and Tex + `(font-latex-bold-face ((,c :inherit bold))) + `(font-latex-doctex-documentation-face ((,c :inherit font-lock-doc-face))) + `(font-latex-doctex-preprocessor-face ((,c :inherit font-lock-preprocessor-face))) + `(font-latex-italic-face ((,c :inherit italic))) + `(font-latex-math-face ((,c :inherit font-lock-constant-face))) + `(font-latex-script-char-face ((,c :inherit font-lock-builtin-face))) + `(font-latex-sectioning-5-face ((,c :inherit (bold modus-themes-variable-pitch) :foreground ,fg-alt))) + `(font-latex-sedate-face ((,c :inherit font-lock-keyword-face))) + `(font-latex-slide-title-face ((,c :inherit modus-themes-heading-1))) + `(font-latex-string-face ((,c :inherit font-lock-string-face))) + `(font-latex-subscript-face ((,c :height 0.95))) + `(font-latex-superscript-face ((,c :height 0.95))) + `(font-latex-underline-face ((,c :inherit underline))) + `(font-latex-verbatim-face ((,c :inherit modus-themes-prose-verbatim))) + `(font-latex-warning-face ((,c :inherit font-lock-warning-face))) + `(tex-verbatim ((,c :inherit modus-themes-prose-verbatim))) + ;; `(texinfo-heading ((,c :foreground ,magenta))) + `(TeX-error-description-error ((,c :inherit error))) + `(TeX-error-description-help ((,c :inherit success))) + `(TeX-error-description-tex-said ((,c :inherit success))) + `(TeX-error-description-warning ((,c :inherit warning))) +;;;;; auto-dim-other-buffers + `(auto-dim-other-buffers-face ((,c :background ,bg-inactive))) +;;;;; avy + `(avy-background-face ((,c :background ,bg-dim :foreground ,fg-dim :extend t))) + `(avy-goto-char-timer-face ((,c :inherit bold :background ,bg-active))) + `(avy-lead-face ((,c :inherit (bold modus-themes-reset-soft) :background ,bg-char-0))) + `(avy-lead-face-0 ((,c :inherit (bold modus-themes-reset-soft) :background ,bg-char-1))) + `(avy-lead-face-1 ((,c :inherit modus-themes-reset-soft :background ,bg-inactive))) + `(avy-lead-face-2 ((,c :inherit (bold modus-themes-reset-soft) :background ,bg-char-2))) +;;;;; aw (ace-window) + `(aw-background-face ((,c :foreground "gray50"))) + `(aw-key-face ((,c :inherit modus-themes-key-binding))) + `(aw-leading-char-face ((,c :inherit (bold modus-themes-reset-soft) :height 1.5 :foreground ,red-intense))) + `(aw-minibuffer-leading-char-face ((,c :inherit modus-themes-key-binding))) + `(aw-mode-line-face ((,c :inherit bold))) +;;;;; binder + `(binder-sidebar-highlight ((,c :inherit modus-themes-hl-line))) + `(binder-sidebar-marked ((,c :inherit modus-themes-mark-sel))) + `(binder-sidebar-missing ((,c :inherit modus-themes-mark-del))) + `(binder-sidebar-tags ((,c :foreground ,variable))) +;;;;; breadcrumb + `(breadcrumb-face ((,c :foreground ,fg-alt))) + `(breadcrumb-imenu-leaf-face ((,c :inherit bold :foreground ,modeline-info))) ; same as `which-func' + `(breadcrumb-project-leaf-face ((,c :inherit bold))) +;;;;; bongo + `(bongo-album-title (( ))) + `(bongo-artist ((,c :foreground ,accent-0))) + `(bongo-currently-playing-track ((,c :inherit bold))) + `(bongo-elapsed-track-part ((,c :background ,bg-inactive :underline t))) + `(bongo-filled-seek-bar ((,c :background ,bg-hover))) + `(bongo-marked-track ((,c :inherit modus-themes-mark-alt))) + `(bongo-marked-track-line ((,c :background ,bg-dim))) + `(bongo-played-track ((,c :inherit shadow :strike-through t))) + `(bongo-track-length ((,c :inherit shadow))) + `(bongo-track-title ((,c :foreground ,accent-1))) + `(bongo-unfilled-seek-bar ((,c :background ,bg-dim))) +;;;;; boon + `(boon-modeline-cmd ((,c :inherit modus-themes-intense-blue))) + `(boon-modeline-ins ((,c :inherit modus-themes-intense-red))) + `(boon-modeline-off ((,c :inherit modus-themes-intense-yellow))) + `(boon-modeline-spc ((,c :inherit modus-themes-intense-green))) +;;;;; bookmark + `(bookmark-face ((,c :inherit success))) + `(bookmark-menu-bookmark ((,c :inherit bold))) +;;;;; calendar and diary + `(calendar-month-header ((,c :inherit bold))) + `(calendar-today ((,c :inherit bold :underline t))) + `(calendar-weekday-header ((,c :foreground ,date-weekday))) + `(calendar-weekend-header ((,c :foreground ,date-weekend))) + `(diary ((,c :foreground ,date-common))) + `(diary-anniversary ((,c :foreground ,date-holiday))) + `(diary-time ((,c :foreground ,date-common))) + `(holiday ((,c :foreground ,date-holiday))) +;;;;; calibredb + ;; NOTE 2022-12-27: Calibredb needs to be reviewed. I had to + ;; change the applicable colors for the transition to + ;; modus-themes version 4, but I cannot test this currently (it + ;; depends on an external program). + `(calibredb-archive-face ((,c :foreground ,accent-3))) + `(calibredb-author-face ((,c :foreground ,name))) + `(calibredb-comment-face ((,c :inherit shadow))) + `(calibredb-date-face ((,c :foreground ,date-common))) + `(calibredb-edit-annotation-header-title-face ((,c :inherit bold))) + `(calibredb-favorite-face ((,c :foreground ,red-warmer))) + `(calibredb-file-face (( ))) + `(calibredb-format-face ((,c :foreground ,fg-alt))) + `(calibredb-highlight-face ((,c :inherit success))) + `(calibredb-id-face (( ))) + `(calibredb-ids-face (( ))) + `(calibredb-search-header-highlight-face ((,c :background ,bg-hl-line :extend t))) + `(calibredb-search-header-library-name-face ((,c :foreground ,accent-2))) + `(calibredb-search-header-library-path-face ((,c :inherit bold))) + `(calibredb-search-header-sort-face ((,c :inherit bold :foreground ,accent-1))) + `(calibredb-search-header-total-face ((,c :inherit bold :foreground ,accent-0))) + `(calibredb-search-header-filter-face ((,c :inherit bold))) + `(calibredb-mark-face ((,c :inherit modus-themes-mark-sel))) + `(calibredb-size-face (( ))) + `(calibredb-tag-face ((,c :foreground ,fg-alt))) +;;;;; centaur-tabs + `(centaur-tabs-active-bar-face ((,c :background ,blue))) + `(centaur-tabs-close-mouse-face ((,c :inherit bold :foreground ,red :underline t))) + `(centaur-tabs-close-selected ((,c :inherit centaur-tabs-selected))) + `(centaur-tabs-close-unselected ((,c :inherit centaur-tabs-unselected))) + `(centaur-tabs-modified-marker-selected ((,c :inherit centaur-tabs-selected))) + `(centaur-tabs-modified-marker-unselected ((,c :inherit centaur-tabs-unselected))) + `(centaur-tabs-default ((,c :background ,bg-main))) + `(centaur-tabs-selected ((,c :inherit bold :box (:line-width -2 :color ,bg-tab-current) :background ,bg-tab-current))) + `(centaur-tabs-selected-modified ((,c :inherit (italic centaur-tabs-selected)))) + `(centaur-tabs-unselected ((,c :box (:line-width -2 :color ,bg-tab-other) :background ,bg-tab-other))) + `(centaur-tabs-unselected-modified ((,c :inherit (italic centaur-tabs-unselected)))) +;;;;; change-log and log-view (`vc-print-log' and `vc-print-root-log') + `(change-log-acknowledgment ((,c :foreground ,identifier))) + `(change-log-conditionals ((,c :inherit error))) + `(change-log-date ((,c :foreground ,date-common))) + `(change-log-email ((,c :foreground ,fg-alt))) + `(change-log-file ((,c :inherit bold))) + `(change-log-function ((,c :inherit warning))) + `(change-log-list ((,c :inherit bold))) + `(change-log-name ((,c :foreground ,name))) + `(log-edit-header ((,c :inherit bold))) + `(log-edit-headers-separator ((,c :height 1 :background ,border :extend t))) + `(log-edit-summary ((,c :inherit success))) + `(log-edit-unknown-header ((,c :inherit shadow))) + `(log-view-commit-body (( ))) + `(log-view-file ((,c :inherit bold))) + `(log-view-message ((,c :foreground ,identifier))) +;;;;; cider + `(cider-deprecated-face ((,c :inherit warning))) + `(cider-enlightened-face ((,c :box ,warning))) + `(cider-enlightened-local-face ((,c :inherit warning))) + `(cider-error-highlight-face ((,c :inherit modus-themes-lang-error))) + `(cider-fringe-good-face ((,c :foreground ,info))) + `(cider-instrumented-face ((,c :box ,err))) + `(cider-reader-conditional-face ((,c :inherit font-lock-type-face))) + `(cider-repl-prompt-face ((,c :inherit minibuffer-prompt))) + `(cider-repl-stderr-face ((,c :foreground ,err))) + `(cider-repl-stdout-face (( ))) + `(cider-warning-highlight-face ((,c :inherit modus-themes-lang-warning))) +;;;;; circe (and lui) + `(circe-fool-face ((,c :inherit shadow))) + `(circe-highlight-nick-face ((,c :inherit error))) + `(circe-prompt-face ((,c :inherit modus-themes-prompt))) + `(circe-server-face ((,c :inherit shadow))) + `(lui-button-face ((,c :inherit button))) + `(lui-highlight-face ((,c :inherit error))) + `(lui-time-stamp-face ((,c :foreground ,date-common))) +;;;;; citar + `(citar ((,c :inherit shadow))) + `(citar-highlight (( ))) +;;;;; clojure-mode + `(clojure-keyword-face ((,c :inherit font-lock-builtin-face))) +;;;;; column-enforce-mode + `(column-enforce-face ((,c :inherit modus-themes-prominent-error))) +;;;;; company-mode + `(company-echo-common ((,c :inherit modus-themes-completion-match-0))) + `(company-preview ((,c :background ,bg-dim :foreground ,fg-dim))) + `(company-preview-common ((,c :inherit company-echo-common))) + `(company-preview-search ((,c :background ,bg-yellow-intense))) + `(company-scrollbar-bg ((,c :background ,bg-active))) + `(company-scrollbar-fg ((,c :background ,fg-main))) + `(company-template-field ((,c :background ,bg-active))) + `(company-tooltip ((,c :background ,bg-dim))) + `(company-tooltip-annotation ((,c :inherit completions-annotations))) + `(company-tooltip-common ((,c :inherit company-echo-common))) + `(company-tooltip-deprecated ((,c :inherit company-tooltip :strike-through t))) + `(company-tooltip-mouse ((,c :inherit highlight))) + `(company-tooltip-scrollbar-thumb ((,c :background ,fg-alt))) + `(company-tooltip-scrollbar-track ((,c :background ,bg-inactive))) + `(company-tooltip-search ((,c :inherit secondary-selection))) + `(company-tooltip-search-selection ((,c :inherit secondary-selection :underline t))) + `(company-tooltip-selection ((,c :inherit modus-themes-completion-selected))) +;;;;; compilation + `(compilation-column-number ((,c :inherit compilation-line-number))) + `(compilation-error ((,c :inherit modus-themes-bold :foreground ,err))) + `(compilation-info ((,c :inherit modus-themes-bold :foreground ,info))) + `(compilation-line-number ((,c :inherit shadow))) + `(compilation-mode-line-exit ((,c :inherit bold))) + `(compilation-mode-line-fail ((,c :inherit bold :foreground ,modeline-err))) + `(compilation-mode-line-run ((,c :inherit bold :foreground ,modeline-warning))) + `(compilation-warning ((,c :inherit modus-themes-bold :foreground ,warning))) +;;;;; completions + `(completions-annotations ((,c :inherit modus-themes-slant :foreground ,docstring))) + `(completions-common-part ((,c :inherit modus-themes-completion-match-0))) + `(completions-first-difference ((,c :inherit modus-themes-completion-match-1))) +;;;;; consult + `(consult-async-split ((,c :inherit error))) + `(consult-file ((,c :inherit modus-themes-bold :foreground ,info))) + `(consult-key ((,c :inherit modus-themes-key-binding))) + `(consult-imenu-prefix ((,c :inherit shadow))) + `(consult-line-number ((,c :inherit shadow))) + `(consult-line-number-prefix ((,c :inherit shadow))) +;;;;; corfu + `(corfu-current ((,c :inherit modus-themes-completion-selected))) + `(corfu-bar ((,c :background ,fg-dim))) + `(corfu-border ((,c :background ,bg-active))) + `(corfu-default ((,c :background ,bg-dim))) +;;;;; corfu-candidate-overlay + `(corfu-candidate-overlay-face ((t :inherit shadow))) +;;;;; corfu-quick + `(corfu-quick1 ((,c :inherit bold :background ,bg-char-0))) + `(corfu-quick2 ((,c :inherit bold :background ,bg-char-1))) +;;;;; counsel + `(counsel-active-mode ((,c :foreground ,keyword))) + `(counsel-application-name ((,c :foreground ,name))) + `(counsel-key-binding ((,c :inherit modus-themes-key-binding))) + `(counsel-outline-default ((,c :foreground ,fg-main))) + `(counsel-variable-documentation ((,c :inherit font-lock-doc-face))) +;;;;; cperl-mode + `(cperl-nonoverridable-face ((,c :foreground unspecified))) + `(cperl-array-face ((,c :inherit font-lock-keyword-face))) + `(cperl-hash-face ((,c :inherit font-lock-variable-name-face))) +;;;;; crontab-mode + `(crontab-minute ((,c :foreground ,string))) + `(crontab-hour ((,c :foreground ,keyword))) + `(crontab-month-day ((,c :foreground ,builtin))) + `(crontab-month ((,c :foreground ,constant))) + `(crontab-week-day ((,c :foreground ,variable))) + `(crontab-predefined ((,c :foreground ,string))) +;;;;; csv-mode + `(csv-separator-face ((,c :foreground ,red-intense))) +;;;;; ctrlf + `(ctrlf-highlight-active ((,c :inherit modus-themes-search-current))) + `(ctrlf-highlight-line ((,c :background ,bg-hl-line :extend t))) + `(ctrlf-highlight-passive ((,c :inherit modus-themes-search-lazy))) +;;;;; custom (M-x customize) + `(custom-button ((,c :inherit modus-themes-button))) + `(custom-button-mouse ((,c :inherit (highlight custom-button)))) + `(custom-button-pressed ((,c :inherit (secondary-selection custom-button)))) + `(custom-changed ((,c :background ,bg-changed))) + `(custom-comment ((,c :inherit shadow))) + `(custom-comment-tag ((,c :inherit (bold shadow)))) + `(custom-invalid ((,c :inherit error :strike-through t))) + `(custom-modified ((,c :inherit custom-changed))) + `(custom-rogue ((,c :inherit custom-invalid))) + `(custom-set ((,c :inherit success))) + `(custom-state ((,c :foreground ,warning))) + `(custom-themed ((,c :inherit custom-changed))) + `(custom-variable-obsolete ((,c :inherit shadow))) + `(custom-face-tag ((,c :inherit bold :foreground ,type))) + `(custom-group-tag ((,c :inherit bold :foreground ,builtin))) + `(custom-group-tag-1 ((,c :inherit bold :foreground ,constant))) + `(custom-variable-tag ((,c :inherit bold :foreground ,variable))) +;;;;; dashboard + `(dashboard-heading ((,c :foreground ,name))) + `(dashboard-items-face (( ))) ; use the underlying style of all-the-icons +;;;;; deadgrep + `(deadgrep-filename-face ((,c :inherit bold :foreground ,name))) + `(deadgrep-match-face ((,c :inherit match))) + `(deadgrep-meta-face ((,c :inherit shadow))) + `(deadgrep-regexp-metachar-face ((,c :inherit font-lock-regexp-grouping-construct))) + `(deadgrep-search-term-face ((,c :inherit success))) +;;;;; deft + `(deft-filter-string-face ((,c :inherit success))) + `(deft-header-face ((,c :inherit shadow))) + `(deft-separator-face ((,c :foreground "gray50"))) + `(deft-summary-face ((,c :inherit (shadow modus-themes-slant)))) + `(deft-time-face ((,c :foreground ,date-common))) + `(deft-title-face ((,c :inherit bold))) +;;;;; devdocs + `(devdocs-code-block ((,c :inherit modus-themes-fixed-pitch :background ,bg-dim :extend t))) +;;;;; dictionary + `(dictionary-button-face ((,c :inherit bold))) + `(dictionary-reference-face ((,c :inherit link))) + `(dictionary-word-definition-face (( ))) + `(dictionary-word-entry-face ((,c :inherit font-lock-comment-face))) +;;;;; diff-hl + `(diff-hl-change ((,c :background ,bg-changed-fringe))) + `(diff-hl-delete ((,c :background ,bg-removed-fringe))) + `(diff-hl-insert ((,c :background ,bg-added-fringe))) + `(diff-hl-reverted-hunk-highlight ((,c :background ,fg-main :foreground ,bg-main))) +;;;;; diff-mode + `(diff-added ((,c :background ,bg-added :foreground ,fg-added))) + `(diff-changed ((,c :background ,bg-changed :foreground ,fg-changed :extend t))) + `(diff-changed-unspecified ((,c :inherit diff-changed))) + `(diff-removed ((,c :background ,bg-removed :foreground ,fg-removed))) + `(diff-refine-added ((,c :background ,bg-added-refine :foreground ,fg-added))) + `(diff-refine-changed ((,c :background ,bg-changed-refine :foreground ,fg-changed))) + `(diff-refine-removed ((,c :background ,bg-removed-refine :foreground ,fg-removed))) + `(diff-indicator-added ((,c :inherit diff-added :foreground ,fg-added-intense))) + `(diff-indicator-changed ((,c :inherit diff-changed :foreground ,fg-changed-intense))) + `(diff-indicator-removed ((,c :inherit diff-removed :foreground ,fg-removed-intense))) + `(diff-context (( ))) + `(diff-error ((,c :inherit error))) + `(diff-file-header ((,c :inherit bold))) + `(diff-function ((,c :background ,bg-inactive))) + `(diff-header (( ))) + `(diff-hunk-header ((,c :inherit bold :background ,bg-inactive))) + `(diff-index ((,c :inherit italic))) + `(diff-nonexistent ((,c :inherit bold))) +;;;;; dim-autoload + `(dim-autoload-cookie-line ((,c :inherit font-lock-comment-face))) +;;;;; dired + `(dired-broken-symlink ((,c :inherit button :foreground ,err))) + `(dired-directory ((,c :foreground ,accent-0))) + `(dired-flagged ((,c :inherit modus-themes-mark-del))) + `(dired-header ((,c :inherit bold))) + `(dired-ignored ((,c :inherit shadow))) + `(dired-mark ((,c :inherit bold))) + `(dired-marked ((,c :inherit modus-themes-mark-sel))) + `(dired-perm-write ((,c :inherit shadow))) + `(dired-symlink ((,c :inherit button :background ,bg-link-symbolic :foreground ,fg-link-symbolic :underline ,underline-link-symbolic))) + `(dired-warning ((,c :inherit warning))) +;;;;; dired-async + `(dired-async-failures ((,c :inherit error))) + `(dired-async-message ((,c :inherit bold))) + `(dired-async-mode-message ((,c :inherit bold))) +;;;;; dired-git + `(dired-git-branch-else ((,c :inherit bold :foreground ,accent-0))) + `(dired-git-branch-master ((,c :inherit bold :foreground ,accent-1))) +;;;;; dired-git-info + `(dgi-commit-message-face ((,c :foreground ,docstring))) +;;;;; dired-narrow + `(dired-narrow-blink ((,c :inherit (modus-themes-prominent-warning bold)))) +;;;;; dired-subtree + ;; remove backgrounds from dired-subtree faces, else they break + ;; dired-{flagged,marked} and any other face that sets a background + ;; such as hl-line. Also, denoting depth by varying shades of gray + ;; is not good for accessibility. + `(dired-subtree-depth-1-face (())) + `(dired-subtree-depth-2-face (())) + `(dired-subtree-depth-3-face (())) + `(dired-subtree-depth-4-face (())) + `(dired-subtree-depth-5-face (())) + `(dired-subtree-depth-6-face (())) +;;;;; diredfl + `(diredfl-autofile-name ((,c :background ,bg-inactive))) + `(diredfl-compressed-file-name ((,c :foreground ,warning))) + `(diredfl-compressed-file-suffix ((,c :foreground ,err))) + `(diredfl-date-time ((,c :foreground ,date-common))) + `(diredfl-deletion ((,c :inherit dired-flagged))) + `(diredfl-deletion-file-name ((,c :inherit diredfl-deletion))) + `(diredfl-dir-heading ((,c :inherit bold))) + `(diredfl-dir-name ((,c :inherit dired-directory))) + `(diredfl-dir-priv ((,c :inherit dired-directory))) + `(diredfl-exec-priv ((,c :foreground ,accent-1))) + `(diredfl-executable-tag ((,c :inherit diredfl-exec-priv))) + `(diredfl-file-name ((,c :foreground ,fg-main))) + `(diredfl-file-suffix ((,c :foreground ,variable))) + `(diredfl-flag-mark ((,c :inherit dired-marked))) + `(diredfl-flag-mark-line ((,c :inherit dired-marked))) + `(diredfl-ignored-file-name ((,c :inherit shadow))) + `(diredfl-link-priv ((,c :foreground ,fg-link))) + `(diredfl-no-priv ((,c :inherit shadow))) + `(diredfl-number ((,c :inherit shadow))) + `(diredfl-other-priv ((,c :foreground ,accent-2))) + `(diredfl-rare-priv ((,c :foreground ,accent-3))) + `(diredfl-read-priv ((,c :foreground ,fg-main))) + `(diredfl-symlink ((,c :inherit dired-symlink))) + `(diredfl-tagged-autofile-name ((,c :inherit (diredfl-autofile-name dired-marked)))) + `(diredfl-write-priv ((,c :foreground ,accent-0))) +;;;;; disk-usage + `(disk-usage-inaccessible ((,c :inherit error))) + `(disk-usage-percent ((,c :foreground ,accent-0))) + `(disk-usage-size ((,c :foreground ,accent-1))) + `(disk-usage-symlink ((,c :inherit dired-symlink))) + `(disk-usage-symlink-directory ((,c :inherit dired-symlink))) +;;;;; display-fill-column-indicator-mode + `(fill-column-indicator ((,c :height 1 :background ,bg-active :foreground ,bg-active))) +;;;;; doom-modeline + `(doom-modeline-bar ((,c :background ,blue))) + `(doom-modeline-bar-inactive ((,c :background ,border))) + `(doom-modeline-battery-charging ((,c :foreground ,modeline-info))) + `(doom-modeline-battery-critical ((,c :underline t :foreground ,modeline-err))) + `(doom-modeline-battery-error ((,c :underline t :foreground ,modeline-err))) + `(doom-modeline-battery-full (( ))) + `(doom-modeline-battery-warning ((,c :inherit warning))) + `(doom-modeline-buffer-file ((,c :inherit bold))) + `(doom-modeline-buffer-major-mode (( ))) + `(doom-modeline-buffer-minor-mode (( ))) + `(doom-modeline-buffer-modified ((,c :foreground ,modeline-err))) + `(doom-modeline-buffer-path (( ))) + `(doom-modeline-evil-emacs-state ((,c :inherit italic))) + `(doom-modeline-evil-insert-state ((,c :foreground ,modeline-info))) + `(doom-modeline-evil-motion-state (( ))) + `(doom-modeline-evil-normal-state (( ))) + `(doom-modeline-evil-operator-state ((,c :inherit bold))) + `(doom-modeline-evil-replace-state ((,c :inherit error))) + `(doom-modeline-evil-visual-state ((,c :inherit warning))) + `(doom-modeline-info ((,c :inherit success))) + `(doom-modeline-input-method (( ))) + `(doom-modeline-lsp-error ((,c :inherit bold-italic))) + `(doom-modeline-lsp-running (( ))) + `(doom-modeline-lsp-success ((,c :inherit success))) + `(doom-modeline-lsp-warning ((,c :inherit warning))) + `(doom-modeline-notification ((,c :inherit error))) + `(doom-modeline-project-dir (( ))) + `(doom-modeline-project-parent-dir (( ))) + `(doom-modeline-project-root-dir (( ))) + `(doom-modeline-repl-success ((,c :inherit success))) + `(doom-modeline-repl-warning ((,c :inherit warning))) + `(doom-modeline-time (( ))) + `(doom-modeline-urgent ((,c :inherit bold-italic :foreground ,modeline-err))) + `(doom-modeline-warning ((,c :inherit warning))) +;;;;; ediff + `(ediff-current-diff-A ((,c :background ,bg-removed :foreground ,fg-removed))) + `(ediff-current-diff-Ancestor ((,c :background ,bg-region))) + `(ediff-current-diff-B ((,c :background ,bg-added :foreground ,fg-added))) + `(ediff-current-diff-C ((,c :background ,bg-changed :foreground ,fg-changed))) + `(ediff-even-diff-A ((,c :background ,bg-diff-context))) + `(ediff-even-diff-Ancestor ((,c :background ,bg-diff-context))) + `(ediff-even-diff-B ((,c :background ,bg-diff-context))) + `(ediff-even-diff-C ((,c :background ,bg-diff-context))) + `(ediff-fine-diff-A ((,c :background ,bg-removed-refine :foreground ,fg-removed))) + `(ediff-fine-diff-Ancestor ((,c :inherit modus-themes-subtle-cyan))) + `(ediff-fine-diff-B ((,c :background ,bg-added-refine :foreground ,fg-added))) + `(ediff-fine-diff-C ((,c :background ,bg-changed-refine :foreground ,fg-changed))) + `(ediff-odd-diff-A ((,c :inherit ediff-even-diff-A))) + `(ediff-odd-diff-Ancestor ((,c :inherit ediff-even-diff-Ancestor))) + `(ediff-odd-diff-B ((,c :inherit ediff-even-diff-B))) + `(ediff-odd-diff-C ((,c :inherit ediff-even-diff-C))) +;;;;; ein (Emacs IPython Notebook) + `(ein:basecell-input-area-face ((,c :background ,bg-dim :extend t))) + `(ein:cell-output-area (( ))) + `(ein:cell-output-area-error ((,c :background ,bg-removed :extend t))) + `(ein:cell-output-stderr ((,c :background ,bg-removed :extend t))) + `(ein:markdowncell-input-area-face (( ))) + `(ein:notification-tab-normal ((,c :underline t))) +;;;;; eglot + `(eglot-mode-line ((,c :inherit modus-themes-bold :foreground ,modeline-info))) + `(eglot-diagnostic-tag-unnecessary-face ((,c :inherit modus-themes-lang-note))) +;;;;; el-search + `(el-search-highlight-in-prompt-face ((,c :inherit italic))) + `(el-search-match ((,c :inherit modus-themes-search-current))) + `(el-search-other-match ((,c :inherit modus-themes-search-lazy))) + `(el-search-occur-match ((,c :inherit match))) +;;;;; eldoc + ;; NOTE: see https://github.com/purcell/package-lint/issues/187 + (list 'eldoc-highlight-function-argument `((,c :inherit modus-themes-mark-alt))) +;;;;; eldoc-box + `(eldoc-box-body ((,c :background ,bg-dim :foreground ,fg-main))) + `(eldoc-box-border ((,c :background ,border))) +;;;;; elfeed + `(elfeed-log-date-face ((,c :inherit elfeed-search-date-face))) + `(elfeed-log-debug-level-face ((,c :inherit elfeed-search-filter-face))) + `(elfeed-log-error-level-face ((,c :inherit error))) + `(elfeed-log-info-level-face ((,c :inherit success))) + `(elfeed-log-warn-level-face ((,c :inherit warning))) + `(elfeed-search-date-face ((,c :foreground ,date-common))) + `(elfeed-search-feed-face ((,c :foreground ,accent-1))) + `(elfeed-search-filter-face ((,c :inherit bold))) + `(elfeed-search-last-update-face ((,c :inherit bold :foreground ,date-common))) + `(elfeed-search-tag-face ((,c :foreground ,accent-0))) + `(elfeed-search-title-face ((,c :foreground ,fg-dim))) + `(elfeed-search-unread-count-face (( ))) + `(elfeed-search-unread-title-face ((,c :inherit bold :foreground ,fg-main))) +;;;;; elfeed-score + `(elfeed-score-date-face ((,c :foreground ,date-common))) + `(elfeed-score-debug-level-face ((,c :inherit bold))) + `(elfeed-score-error-level-face ((,c :inherit error))) + `(elfeed-score-info-level-face ((,c :inherit success))) + `(elfeed-score-warn-level-face ((,c :inherit warning))) +;;;;; elpher + `(elpher-gemini-heading1 ((,c :inherit modus-themes-heading-1))) + `(elpher-gemini-heading2 ((,c :inherit modus-themes-heading-2))) + `(elpher-gemini-heading3 ((,c :inherit modus-themes-heading-3))) +;;;;; embark + `(embark-keybinding ((,c :inherit modus-themes-key-binding))) + `(embark-collect-marked ((,c :inherit modus-themes-mark-sel))) +;;;;; ement (ement.el) + `(ement-room-fully-read-marker ((,c :inherit success))) + `(ement-room-membership ((,c :inherit shadow))) + `(ement-room-mention ((,c :inherit highlight))) + `(ement-room-name ((,c :inherit bold))) + `(ement-room-reactions ((,c :inherit shadow))) + `(ement-room-read-receipt-marker ((,c :inherit match))) + `(ement-room-self ((,c :inherit bold :foreground ,accent-1))) + `(ement-room-self-message ((,c :foreground ,fg-alt))) + `(ement-room-timestamp ((,c :inherit shadow))) + `(ement-room-timestamp-header ((,c :inherit bold :foreground ,date-common))) + `(ement-room-user ((,c :inherit bold :foreground ,accent-0))) +;;;;; emms + `(emms-browser-album-face ((,c :foreground ,keyword))) + `(emms-browser-artist-face ((,c :foreground ,variable))) + `(emms-browser-composer-face ((,c :foreground ,builtin))) + `(emms-browser-performer-face ((,c :inherit emms-browser-artist-face))) + `(emms-browser-track-face ((,c :inherit emms-playlist-track-face))) + `(emms-browser-year/genre-face ((,c :foreground ,type))) + `(emms-playlist-track-face ((,c :foreground ,string))) + `(emms-playlist-selected-face ((,c :inherit bold :foreground ,constant))) + `(emms-metaplaylist-mode-current-face ((,c :inherit emms-playlist-selected-face))) + `(emms-metaplaylist-mode-face ((,c :foreground ,variable))) +;;;;; enh-ruby-mode (enhanced-ruby-mode) + `(enh-ruby-heredoc-delimiter-face ((,c :inherit font-lock-constant-face))) + `(enh-ruby-op-face ((,c :foreground ,fg-main))) + `(enh-ruby-regexp-delimiter-face ((,c :inherit font-lock-regexp-grouping-construct))) + `(enh-ruby-regexp-face ((,c :inherit font-lock-string-face))) + `(enh-ruby-string-delimiter-face ((,c :inherit font-lock-string-face))) + `(erm-syn-errline ((,c :inherit modus-themes-lang-error))) + `(erm-syn-warnline ((,c :inherit modus-themes-lang-warning))) +;;;;; epa + `(epa-field-body (( ))) + `(epa-field-name ((,c :inherit bold :foreground ,fg-dim))) + `(epa-mark ((,c :inherit bold))) + `(epa-string ((,c :foreground ,string))) + `(epa-validity-disabled ((,c :foreground ,err))) + `(epa-validity-high ((,c :inherit success))) + `(epa-validity-low ((,c :inherit shadow))) + `(epa-validity-medium ((,c :foreground ,info))) +;;;;; erc + `(erc-action-face ((,c :foreground ,accent-2))) + `(erc-bold-face ((,c :inherit bold))) + `(erc-button ((,c :inherit button))) + `(erc-command-indicator-face ((,c :inherit bold :foreground ,accent-3))) + `(erc-current-nick-face ((,c :inherit match))) + `(erc-dangerous-host-face ((,c :inherit error))) + `(erc-direct-msg-face ((,c :inherit shadow))) + `(erc-error-face ((,c :inherit error))) + `(erc-fool-face ((,c :inherit shadow))) + `(erc-input-face ((,c :foreground ,fnname))) + `(erc-inverse-face ((,c :inherit erc-default-face :inverse-video t))) + `(erc-keyword-face ((,c :inherit bold :foreground ,keyword))) + `(erc-my-nick-face ((,c :inherit bold :foreground ,name))) + `(erc-my-nick-prefix-face ((,c :inherit erc-my-nick-face))) + `(erc-nick-default-face ((,c :inherit bold :foreground ,accent-0))) + `(erc-nick-msg-face ((,c :inherit warning))) + `(erc-nick-prefix-face ((,c :inherit erc-nick-default-face))) + `(erc-notice-face ((,c :inherit font-lock-comment-face))) + `(erc-pal-face ((,c :inherit bold :foreground ,accent-1))) + `(erc-prompt-face ((,c :inherit modus-themes-prompt))) + `(erc-timestamp-face ((,c :foreground ,date-common))) + `(erc-underline-face ((,c :underline t))) +;;;;; ert + `(ert-test-result-expected ((,c :inherit modus-themes-prominent-note))) + `(ert-test-result-unexpected ((,c :inherit modus-themes-prominent-error))) +;;;;; erts-mode + `(erts-mode-end-test ((,c :inherit error))) + `(erts-mode-specification-name ((,c :inherit bold))) + `(erts-mode-specification-value ((,c :foreground ,string))) + `(erts-mode-start-test ((,c :inherit success))) +;;;;; eshell + `(eshell-ls-archive ((,c :foreground ,accent-2))) + `(eshell-ls-backup ((,c :inherit shadow))) + `(eshell-ls-clutter ((,c :inherit shadow))) + `(eshell-ls-directory ((,c :foreground ,accent-0))) + `(eshell-ls-executable ((,c :foreground ,accent-1))) + `(eshell-ls-missing ((,c :inherit error))) + `(eshell-ls-product ((,c :inherit shadow))) + `(eshell-ls-readonly ((,c :foreground ,warning))) + `(eshell-ls-special ((,c :foreground ,accent-3))) + `(eshell-ls-symlink ((,c :inherit link))) + `(eshell-ls-unreadable ((,c :inherit shadow))) + `(eshell-prompt ((,c :inherit modus-themes-prompt))) +;;;;; eshell-fringe-status + `(eshell-fringe-status-failure ((,c :inherit error))) + `(eshell-fringe-status-success ((,c :inherit success))) +;;;;; evil-mode + `(evil-ex-commands ((,c :inherit font-lock-keyword-face))) + `(evil-ex-info ((,c :inherit font-lock-type-face))) + `(evil-ex-lazy-highlight ((,c :inherit modus-themes-search-lazy))) + `(evil-ex-search ((,c :inherit modus-themes-search-current))) + `(evil-ex-substitute-matches ((,c :inherit modus-themes-prominent-error :underline t))) + `(evil-ex-substitute-replacement ((,c :inherit modus-themes-search-current))) +;;;;; eww + `(eww-invalid-certificate ((,c :foreground ,err))) + `(eww-valid-certificate ((,c :foreground ,info))) + `(eww-form-checkbox ((,c :inherit eww-form-text))) + `(eww-form-file ((,c :inherit eww-form-submit))) + `(eww-form-select ((,c :inherit eww-form-submit))) + `(eww-form-submit ((,c :inherit modus-themes-button))) + `(eww-form-text ((,c :inherit widget-field))) + `(eww-form-textarea ((,c :inherit eww-form-text))) +;;;;; eyebrowse + `(eyebrowse-mode-line-active ((,c :inherit mode-line-emphasis))) +;;;;; flycheck + `(flycheck-error ((,c :inherit modus-themes-lang-error))) + `(flycheck-fringe-error ((,c :inherit modus-themes-prominent-error))) + `(flycheck-fringe-info ((,c :inherit modus-themes-prominent-note))) + `(flycheck-fringe-warning ((,c :inherit modus-themes-prominent-warning))) + `(flycheck-info ((,c :inherit modus-themes-lang-note))) + `(flycheck-warning ((,c :inherit modus-themes-lang-warning))) +;;;;; flycheck-color-mode-line + `(flycheck-color-mode-line-error-face ((,c :inherit flycheck-fringe-error))) + `(flycheck-color-mode-line-info-face ((,c :inherit flycheck-fringe-info))) + `(flycheck-color-mode-line-running-face ((,c :inherit italic))) + `(flycheck-color-mode-line-info-face ((,c :inherit flycheck-fringe-warning))) +;;;;; flycheck-indicator + `(flycheck-indicator-disabled ((,c :inherit modus-themes-slant :foreground ,fg-dim))) + `(flycheck-indicator-error ((,c :inherit error))) + `(flycheck-indicator-info ((,c :inherit bold))) + `(flycheck-indicator-running ((,c :inherit modus-themes-slant))) + `(flycheck-indicator-success ((,c :inherit success))) + `(flycheck-indicator-warning ((,c :inherit warning))) +;;;;; flymake + `(flymake-end-of-line-diagnostics-face ((,c :inherit modus-themes-slant :height 0.85 :box ,border))) + `(flymake-error ((,c :inherit modus-themes-lang-error))) + `(flymake-error-echo ((,c :inherit error))) + `(flymake-error-echo-at-eol ((,c :inherit flymake-end-of-line-diagnostics-face :foreground ,err))) + `(flymake-note ((,c :inherit modus-themes-lang-note))) + `(flymake-note-echo ((,c :inherit success))) + `(flymake-note-echo-at-eol ((,c :inherit flymake-end-of-line-diagnostics-face :foreground ,info))) + `(flymake-warning ((,c :inherit modus-themes-lang-warning))) + `(flymake-warning-echo ((,c :inherit warning))) + `(flymake-note-echo-at-eol ((,c :inherit flymake-end-of-line-diagnostics-face :foreground ,warning))) +;;;;; flyspell + `(flyspell-duplicate ((,c :inherit modus-themes-lang-warning))) + `(flyspell-incorrect ((,c :inherit modus-themes-lang-error))) +;;;;; flx + `(flx-highlight-face ((,c :inherit modus-themes-completion-match-0))) +;;;;; focus + `(focus-unfocused ((,c :foreground "gray50"))) +;;;;; fold-this + `(fold-this-overlay ((,c :background ,bg-inactive))) +;;;;; font-lock + `(font-lock-builtin-face ((,c :inherit modus-themes-bold :foreground ,builtin))) + `(font-lock-comment-delimiter-face ((,c :inherit font-lock-comment-face))) + `(font-lock-comment-face ((,c :inherit modus-themes-slant :foreground ,comment))) + `(font-lock-constant-face ((,c :foreground ,constant))) + `(font-lock-doc-face ((,c :inherit modus-themes-slant :foreground ,docstring))) + `(font-lock-doc-markup-face ((,c :inherit modus-themes-slant :foreground ,docmarkup))) + `(font-lock-function-name-face ((,c :foreground ,fnname))) + `(font-lock-keyword-face ((,c :inherit modus-themes-bold :foreground ,keyword))) + `(font-lock-negation-char-face ((,c :inherit error))) + `(font-lock-preprocessor-face ((,c :foreground ,preprocessor))) + `(font-lock-regexp-grouping-backslash ((,c :inherit modus-themes-bold :foreground ,rx-backslash))) + `(font-lock-regexp-grouping-construct ((,c :inherit modus-themes-bold :foreground ,rx-construct))) + `(font-lock-string-face ((,c :foreground ,string))) + `(font-lock-type-face ((,c :inherit modus-themes-bold :foreground ,type))) + `(font-lock-variable-name-face ((,c :foreground ,variable))) + `(font-lock-warning-face ((,c :inherit modus-themes-bold :foreground ,warning))) +;;;;; geiser + `(geiser-font-lock-autodoc-current-arg ((,c :inherit modus-themes-mark-alt))) + `(geiser-font-lock-autodoc-identifier ((,c :foreground ,docstring))) + `(geiser-font-lock-doc-button ((,c :inherit button))) + `(geiser-font-lock-doc-link ((,c :inherit button))) + `(geiser-font-lock-error-link ((,c :inherit button :foreground ,err))) + `(geiser-font-lock-image-button ((,c :inherit button :foreground ,info))) + `(geiser-font-lock-repl-input ((,c :inherit bold))) + `(geiser-font-lock-repl-output ((,c :inherit font-lock-keyword-face))) + `(geiser-font-lock-repl-prompt ((,c :inherit modus-themes-prompt))) + `(geiser-font-lock-xref-header ((,c :inherit bold))) + `(geiser-font-lock-xref-link ((,c :inherit button))) +;;;;; git-commit + `(git-commit-comment-action ((,c :inherit font-lock-comment-face))) + `(git-commit-comment-branch-local ((,c :inherit font-lock-comment-face :foreground ,accent-0))) + `(git-commit-comment-branch-remote ((,c :inherit font-lock-comment-face :foreground ,accent-1))) + `(git-commit-comment-heading ((,c :inherit (bold font-lock-comment-face)))) + `(git-commit-comment-file ((,c :inherit font-lock-comment-face :foreground ,name))) + `(git-commit-keyword ((,c :foreground ,keyword))) + `(git-commit-nonempty-second-line ((,c :inherit error))) + `(git-commit-overlong-summary ((,c :inherit warning))) + `(git-commit-summary ((,c :inherit success))) +;;;;; git-gutter + `(git-gutter:added ((,c :background ,bg-added-fringe))) + `(git-gutter:deleted ((,c :background ,bg-removed-fringe))) + `(git-gutter:modified ((,c :background ,bg-changed-fringe))) + `(git-gutter:separator ((,c :inherit modus-themes-intense-cyan))) + `(git-gutter:unchanged ((,c :inherit modus-themes-intense-magenta))) +;;;;; git-gutter-fr + `(git-gutter-fr:added ((,c :background ,bg-added-fringe))) + `(git-gutter-fr:deleted ((,c :background ,bg-removed-fringe))) + `(git-gutter-fr:modified ((,c :background ,bg-changed-fringe))) +;;;;; git-rebase + `(git-rebase-comment-hash ((,c :inherit (bold font-lock-comment-face) :foreground ,identifier))) + `(git-rebase-comment-heading ((,c :inherit (bold font-lock-comment-face)))) + `(git-rebase-description ((,c :foreground ,fg-main))) + `(git-rebase-hash ((,c :foreground ,identifier))) +;;;;; git-timemachine + `(git-timemachine-commit ((,c :inherit warning))) + `(git-timemachine-minibuffer-author-face ((,c :foreground ,name))) + `(git-timemachine-minibuffer-detail-face ((,c :foreground ,fg-main))) +;;;;; gnus + `(gnus-button ((,c :inherit button))) + `(gnus-cite-1 ((,c :inherit message-cited-text-1))) + `(gnus-cite-2 ((,c :inherit message-cited-text-2))) + `(gnus-cite-3 ((,c :inherit message-cited-text-3))) + `(gnus-cite-4 ((,c :inherit message-cited-text-4))) + `(gnus-cite-5 ((,c :inherit message-cited-text-1))) + `(gnus-cite-6 ((,c :inherit message-cited-text-2))) + `(gnus-cite-7 ((,c :inherit message-cited-text-3))) + `(gnus-cite-8 ((,c :inherit message-cited-text-4))) + `(gnus-cite-9 ((,c :inherit message-cited-text-1))) + `(gnus-cite-10 ((,c :inherit message-cited-text-2))) + `(gnus-cite-11 ((,c :inherit message-cited-text-3))) + `(gnus-cite-attribution ((,c :inherit italic))) + `(gnus-emphasis-bold ((,c :inherit bold))) + `(gnus-emphasis-bold-italic ((,c :inherit bold-italic))) + `(gnus-emphasis-highlight-words ((,c :inherit warning))) + `(gnus-emphasis-italic ((,c :inherit italic))) + `(gnus-emphasis-underline-bold ((,c :inherit gnus-emphasis-bold :underline t))) + `(gnus-emphasis-underline-bold-italic ((,c :inherit gnus-emphasis-bold-italic :underline t))) + `(gnus-emphasis-underline-italic ((,c :inherit gnus-emphasis-italic :underline t))) + `(gnus-group-mail-1 ((,c :inherit (bold gnus-group-mail-1-empty)))) + `(gnus-group-mail-1-empty ((,c :foreground ,magenta-warmer))) + `(gnus-group-mail-2 ((,c :inherit (bold gnus-group-mail-2-empty)))) + `(gnus-group-mail-2-empty ((,c :foreground ,magenta))) + `(gnus-group-mail-3 ((,c :inherit (bold gnus-group-mail-3-empty)))) + `(gnus-group-mail-3-empty ((,c :foreground ,magenta-cooler))) + `(gnus-group-mail-low ((,c :inherit (bold gnus-group-mail-low-empty)))) + `(gnus-group-mail-low-empty ((,c :foreground ,fg-dim))) + `(gnus-group-news-1 ((,c :inherit (bold gnus-group-news-1-empty)))) + `(gnus-group-news-1-empty ((,c :foreground ,green))) + `(gnus-group-news-2 ((,c :inherit (bold gnus-group-news-2-empty)))) + `(gnus-group-news-2-empty ((,c :foreground ,cyan))) + `(gnus-group-news-3 ((,c :inherit (bold gnus-group-news-3-empty)))) + `(gnus-group-news-3-empty ((,c :foreground ,yellow-faint))) + `(gnus-group-news-4 ((,c :inherit (bold gnus-group-news-4-empty)))) + `(gnus-group-news-4-empty ((,c :foreground ,magenta-faint))) + `(gnus-group-news-5 ((,c :inherit (bold gnus-group-news-5-empty)))) + `(gnus-group-news-5-empty ((,c :foreground ,fg-alt))) + `(gnus-group-news-6 ((,c :inherit (bold gnus-group-news-6-empty)))) + `(gnus-group-news-6-empty ((,c :foreground ,fg-dim))) + `(gnus-group-news-low ((,c :inherit (bold gnus-group-news-low-empty)))) + `(gnus-group-news-low-empty ((,c :foreground ,fg-dim))) + `(gnus-header-content ((,c :inherit message-header-other))) + `(gnus-header-from ((,c :inherit message-header-to :underline nil))) + `(gnus-header-name ((,c :inherit message-header-name))) + `(gnus-header-newsgroups ((,c :inherit message-header-newsgroups))) + `(gnus-header-subject ((,c :inherit message-header-subject))) + `(gnus-server-agent ((,c :inherit bold))) + `(gnus-server-closed ((,c :inherit italic))) + `(gnus-server-cloud ((,c :inherit bold :foreground ,fg-alt))) + `(gnus-server-cloud-host ((,c :inherit bold :foreground ,fg-alt :underline t))) + `(gnus-server-denied ((,c :inherit error))) + `(gnus-server-offline ((,c :inherit shadow))) + `(gnus-server-opened ((,c :inherit success))) + `(gnus-summary-cancelled ((,c :inherit italic :foreground ,warning))) + `(gnus-summary-high-ancient ((,c :inherit bold :foreground ,fg-alt))) + `(gnus-summary-high-read ((,c :inherit bold :foreground ,fg-dim))) + `(gnus-summary-high-ticked ((,c :inherit bold :foreground ,err))) + `(gnus-summary-high-undownloaded ((,c :inherit bold-italic :foreground ,warning))) + `(gnus-summary-high-unread ((,c :inherit bold))) + `(gnus-summary-low-ancient ((,c :inherit italic))) + `(gnus-summary-low-read ((,c :inherit (shadow italic)))) + `(gnus-summary-low-ticked ((,c :inherit italic :foreground ,err))) + `(gnus-summary-low-undownloaded ((,c :inherit italic :foreground ,warning))) + `(gnus-summary-low-unread ((,c :inherit italic))) + `(gnus-summary-normal-ancient (( ))) + `(gnus-summary-normal-read ((,c :inherit shadow))) + `(gnus-summary-normal-ticked ((,c :foreground ,err))) + `(gnus-summary-normal-undownloaded ((,c :foreground ,warning))) + `(gnus-summary-normal-unread (( ))) + `(gnus-summary-selected ((,c :inherit highlight))) +;;;;; gotest + `(go-test--ok-face ((,c :inherit success))) + `(go-test--error-face ((,c :inherit error))) + `(go-test--warning-face ((,c :inherit warning))) + `(go-test--pointer-face ((,c :foreground ,accent-0))) + `(go-test--standard-face (( ))) +;;;;; golden-ratio-scroll-screen + `(golden-ratio-scroll-highlight-line-face ((,c :background ,bg-cyan-subtle :foreground ,fg-main))) +;;;;; helpful + `(helpful-heading ((,c :inherit modus-themes-heading-1))) +;;;;; highlight region or ad-hoc regexp + ;; HACK 2022-06-23: The :inverse-video prevents hl-line-mode from + ;; overriding the background. Such an override really defeats the + ;; purpose of setting those highlights. + ;; + ;; NOTE 2022-10-04: We do not use the ,c here but instead + ;; hardcode color values. We have to do this as the themes lack + ;; entries in their palette for such an edge case. Defining those + ;; entries is not appropriate. + `(hi-aquamarine ((((class color) (min-colors 88) (background light)) + :background "white" :foreground "#227f9f" :inverse-video t) + (((class color) (min-colors 88) (background dark)) + :background "black" :foreground "#66cbdc" :inverse-video t))) + `(hi-black-b ((,c :inverse-video t))) + `(hi-black-hb ((,c :background ,bg-main :foreground ,fg-dim :inverse-video t))) + `(hi-blue ((((class color) (min-colors 88) (background light)) + :background "white" :foreground "#3366dd" :inverse-video t) + (((class color) (min-colors 88) (background dark)) + :background "black" :foreground "#aaccff" :inverse-video t))) + `(hi-blue-b ((,c :inherit (bold hi-blue)))) + `(hi-green ((((class color) (min-colors 88) (background light)) + :background "white" :foreground "#008a00" :inverse-video t) + (((class color) (min-colors 88) (background dark)) + :background "black" :foreground "#66dd66" :inverse-video t))) + `(hi-green-b ((,c :inherit (bold hi-green)))) + `(hi-pink ((((class color) (min-colors 88) (background light)) + :background "white" :foreground "#bd30aa" :inverse-video t) + (((class color) (min-colors 88) (background dark)) + :background "black" :foreground "#ff88ee" :inverse-video t))) + `(hi-red-b ((((class color) (min-colors 88) (background light)) + :background "white" :foreground "#dd0000" :inverse-video t) + (((class color) (min-colors 88) (background dark)) + :background "black" :foreground "#f06666" :inverse-video t))) + `(hi-salmon ((((class color) (min-colors 88) (background light)) + :background "white" :foreground "#bf555a" :inverse-video t) + (((class color) (min-colors 88) (background dark)) + :background "black" :foreground "#e08a50" :inverse-video t))) + `(hi-yellow ((((class color) (min-colors 88) (background light)) + :background "white" :foreground "#af6400" :inverse-video t) + (((class color) (min-colors 88) (background dark)) + :background "black" :foreground "#faea00" :inverse-video t))) + `(highlight-changes ((,c :foreground ,warning :underline nil))) + `(highlight-changes-delete ((,c :foreground ,err :underline t))) + `(hl-line ((,c :background ,bg-hl-line :extend t))) +;;;;; highlight-numbers + `(highlight-numbers-number ((,c :foreground ,constant))) +;;;;; highlight-thing + `(highlight-thing ((,c :inherit match))) +;;;;; hl-fill-column + `(hl-fill-column-face ((,c :background ,bg-active))) +;;;;; hl-todo + `(hl-todo ((,c :inherit (bold font-lock-comment-face) :foreground ,err))) +;;;;; hydra + `(hydra-face-amaranth ((,c :inherit bold :foreground ,yellow-warmer))) + `(hydra-face-blue ((,c :inherit bold :foreground ,blue))) + `(hydra-face-pink ((,c :inherit bold :foreground ,magenta))) + `(hydra-face-red ((,c :inherit bold :foreground ,red-faint))) + `(hydra-face-teal ((,c :inherit bold :foreground ,cyan-cooler))) +;;;;; icomplete + `(icomplete-first-match ((,c :inherit modus-themes-completion-match-0))) + `(icomplete-selected-match ((,c :inherit modus-themes-completion-selected))) +;;;;; ido-mode + `(ido-first-match ((,c :inherit modus-themes-completion-match-0))) + `(ido-incomplete-regexp ((,c :inherit error))) + `(ido-indicator ((,c :inherit bold))) + `(ido-only-match ((,c :inherit ido-first-match))) + `(ido-subdir ((,c :foreground ,accent-0))) + `(ido-virtual ((,c :foreground ,accent-1))) +;;;;; iedit + `(iedit-occurrence ((,c :inherit modus-themes-search-lazy))) + `(iedit-read-only-occurrence ((,c :inherit modus-themes-search-current))) +;;;;; iflipb + `(iflipb-current-buffer-face ((,c :inherit bold :foreground ,name))) + `(iflipb-other-buffer-face ((,c :inherit shadow))) +;;;;; image-dired + `(image-dired-thumb-flagged ((,c :inherit modus-themes-mark-del :box (:line-width -3)))) + `(image-dired-thumb-header-file-name ((,c :inherit bold))) + `(image-dired-thumb-header-file-size ((,c :foreground ,constant))) + `(image-dired-thumb-mark ((,c :inherit modus-themes-mark-sel :box (:line-width -3)))) +;;;;; imenu-list + `(imenu-list-entry-face-0 ((,c :foreground ,fg-heading-0))) + `(imenu-list-entry-face-1 ((,c :foreground ,fg-heading-1))) + `(imenu-list-entry-face-2 ((,c :foreground ,fg-heading-2))) + `(imenu-list-entry-face-3 ((,c :foreground ,fg-heading-3))) + `(imenu-list-entry-subalist-face-0 ((,c :inherit bold :foreground ,fg-heading-4 :underline t))) + `(imenu-list-entry-subalist-face-1 ((,c :inherit bold :foreground ,fg-heading-5 :underline t))) + `(imenu-list-entry-subalist-face-2 ((,c :inherit bold :foreground ,fg-heading-6 :underline t))) + `(imenu-list-entry-subalist-face-3 ((,c :inherit bold :foreground ,fg-heading-7 :underline t))) +;;;;; indium + `(indium-breakpoint-face ((,c :foreground ,err))) + `(indium-frame-url-face ((,c :inherit (shadow button)))) + `(indium-keyword-face ((,c :inherit font-lock-keyword-face))) + `(indium-litable-face ((,c :inherit modus-themes-slant))) + `(indium-repl-error-face ((,c :inherit error))) + `(indium-repl-prompt-face ((,c :inherit modus-themes-prompt))) + `(indium-repl-stdout-face (( ))) +;;;;; info + `(Info-quoted ((,c :inherit modus-themes-prose-verbatim))) ; the capitalization is canonical + `(info-header-node ((,c :inherit (shadow bold)))) + `(info-header-xref ((,c :foreground ,fg-link))) + `(info-index-match ((,c :inherit match))) + `(info-menu-header ((,c :inherit bold))) + `(info-menu-star ((,c :inherit error))) + `(info-node ((,c :inherit bold))) + `(info-title-1 ((,c :inherit modus-themes-heading-1))) + `(info-title-2 ((,c :inherit modus-themes-heading-2))) + `(info-title-3 ((,c :inherit modus-themes-heading-3))) + `(info-title-4 ((,c :inherit modus-themes-heading-4))) +;;;;; info+ (info-plus) + `(info-command-ref-item ((,c :inherit font-lock-function-name-face))) + `(info-constant-ref-item ((,c :inherit font-lock-constant-face))) + `(info-custom-delimited ((,c :inherit modus-themes-prose-verbatim))) + `(info-double-quoted-name ((,c :inherit font-lock-string-face))) + `(info-file (( ))) + `(info-function-ref-item ((,c :inherit font-lock-function-name-face))) + `(info-glossary-word ((,c :inherit modus-themes-button))) + `(info-indented-text (( ))) + `(info-isolated-backquote (( ))) + `(info-isolated-quote (( ))) + `(info-macro-ref-item ((,c :inherit font-lock-keyword-face))) + `(info-menu ((,c :inherit bold))) + `(info-quoted-name ((,c :inherit modus-themes-prose-verbatim))) + `(info-reference-item ((,c :inherit bold))) + `(info-special-form-ref-item ((,c :inherit warning))) + `(info-string ((,c :inherit font-lock-string-face))) + `(info-syntax-class-item ((,c :inherit modus-themes-prose-code))) + `(info-user-option-ref-item ((,c :inherit font-lock-variable-name-face))) + `(info-variable-ref-item ((,c :inherit font-lock-variable-name-face))) +;;;;; info-colors + `(info-colors-lisp-code-block ((,c :inherit modus-themes-fixed-pitch))) + `(info-colors-ref-item-command ((,c :inherit font-lock-function-name-face))) + `(info-colors-ref-item-constant ((,c :inherit font-lock-constant-face))) + `(info-colors-ref-item-function ((,c :inherit font-lock-function-name-face))) + `(info-colors-ref-item-macro ((,c :inherit font-lock-keyword-face))) + `(info-colors-ref-item-other ((,c :inherit font-lock-doc-face))) + `(info-colors-ref-item-special-form ((,c :inherit font-lock-keyword-face))) + `(info-colors-ref-item-syntax-class ((,c :inherit font-lock-builtin-face))) + `(info-colors-ref-item-type ((,c :inherit font-lock-type-face))) + `(info-colors-ref-item-user-option ((,c :inherit font-lock-variable-name-face))) + `(info-colors-ref-item-variable ((,c :inherit font-lock-variable-name-face))) +;;;;; ioccur + `(ioccur-cursor ((,c :foreground ,fg-main))) + `(ioccur-invalid-regexp ((,c :inherit error))) + `(ioccur-match-face ((,c :inherit match))) + `(ioccur-match-overlay-face ((,c :background ,bg-inactive :extend t))) + `(ioccur-num-line-face ((,c :inherit shadow))) + `(ioccur-overlay-face ((,c :background ,bg-hl-line :extend t))) + `(ioccur-regexp-face ((,c :inherit (modus-themes-search-current bold)))) + `(ioccur-title-face ((,c :inherit bold :foreground ,name))) +;;;;; isearch, occur, and the like + `(isearch ((,c :inherit modus-themes-search-current))) + `(isearch-fail ((,c :inherit modus-themes-prominent-error))) + `(isearch-group-1 ((,c :inherit modus-themes-intense-blue))) + `(isearch-group-2 ((,c :inherit modus-themes-intense-magenta))) + `(lazy-highlight ((,c :inherit modus-themes-search-lazy))) + `(match ((,c :background ,bg-magenta-subtle :foreground ,fg-main))) + `(query-replace ((,c :inherit modus-themes-prominent-error))) +;;;;; ivy + `(ivy-action ((,c :inherit modus-themes-key-binding))) + `(ivy-confirm-face ((,c :inherit success))) + `(ivy-current-match ((,c :inherit modus-themes-completion-selected))) + `(ivy-match-required-face ((,c :inherit error))) + `(ivy-minibuffer-match-face-1 (( ))) + `(ivy-minibuffer-match-face-2 ((,c :inherit modus-themes-completion-match-0))) + `(ivy-minibuffer-match-face-3 ((,c :inherit modus-themes-completion-match-1))) + `(ivy-minibuffer-match-face-4 ((,c :inherit modus-themes-completion-match-2))) + `(ivy-remote ((,c :inherit italic))) + `(ivy-separator ((,c :inherit shadow))) + `(ivy-subdir ((,c :foreground ,accent-0))) + `(ivy-virtual ((,c :foreground ,accent-1))) +;;;;; ivy-posframe + `(ivy-posframe-border ((,c :background ,border))) + `(ivy-posframe-cursor ((,c :background ,fg-main :foreground ,bg-main))) +;;;;; japanese-holidays + `(japanese-holiday-saturday ((,c :foreground ,date-holiday-other))) +;;;;; jira (org-jira) + `(jiralib-comment-face ((,c :background ,bg-inactive))) + `(jiralib-comment-header-face ((,c :inherit bold))) + `(jiralib-issue-info-face ((,c :background ,bg-inactive))) + `(jiralib-issue-info-header-face ((,c :inherit bold :background ,bg-inactive))) + `(jiralib-issue-summary-face ((,c :inherit bold))) + `(jiralib-link-filter-face ((,c :underline t))) + `(jiralib-link-issue-face ((,c :underline t))) + `(jiralib-link-project-face ((,c :underline t))) +;;;;; jit-spell + `(jit-spell-misspelling ((,c :inherit modus-themes-lang-error))) +;;;;; jinx + `(jinx-misspelled ((,c :inherit modus-themes-lang-warning))) +;;;;; journalctl-mode + `(journalctl-error-face ((,c :inherit error))) + `(journalctl-finished-face ((,c :inherit success))) + `(journalctl-host-face ((,c :foreground ,name))) + `(journalctl-process-face ((,c :foreground ,warning))) + `(journalctl-starting-face ((,c :foreground ,info))) + `(journalctl-timestamp-face ((,c :foreground ,date-common))) + `(journalctl-warning-face ((,c :inherit warning))) +;;;;; js2-mode + `(js2-error ((,c :inherit modus-themes-lang-error))) + `(js2-external-variable ((,c :inherit font-lock-variable-name-face))) + `(js2-function-call ((,c :inherit font-lock-function-name-face))) + `(js2-function-param ((,c :inherit font-lock-constant-face))) + `(js2-instance-member ((,c :inherit font-lock-keyword-face))) + `(js2-jsdoc-html-tag-delimiter ((,c :foreground ,fg-main))) + `(js2-jsdoc-html-tag-name ((,c :inherit font-lock-function-name-face))) + `(js2-jsdoc-tag ((,c :inherit (font-lock-builtin-face font-lock-comment-face) :weight normal))) + `(js2-jsdoc-type ((,c :inherit (font-lock-type-face font-lock-comment-face) :weight normal))) + `(js2-jsdoc-value ((,c :inherit (font-lock-constant-face font-lock-comment-face) :weight normal))) + `(js2-object-property ((,c :foreground ,fg-main))) + `(js2-object-property-access ((,c :foreground ,fg-main))) + `(js2-private-function-call ((,c :inherit font-lock-preprocessor-face))) + `(js2-private-member ((,c :inherit font-lock-warning-face))) + `(js2-warning ((,c :inherit modus-themes-lang-warning))) +;;;;; julia + `(julia-macro-face ((,c :inherit font-lock-builtin-face))) + `(julia-quoted-symbol-face ((,c :inherit font-lock-constant-face))) +;;;;; kaocha-runner + `(kaocha-runner-error-face ((,c :inherit error))) + `(kaocha-runner-success-face ((,c :inherit success))) + `(kaocha-runner-warning-face ((,c :inherit warning))) +;;;;; keycast + `(keycast-command ((,c :inherit bold))) + `(keycast-key ((,c :background ,keybind :foreground ,bg-main))) +;;;;; ledger-mode + `(ledger-font-auto-xact-face ((,c :inherit font-lock-builtin-face))) + `(ledger-font-account-name-face ((,c :foreground ,name))) + `(ledger-font-directive-face ((,c :inherit font-lock-keyword-face))) + `(ledger-font-posting-date-face ((,c :inherit modus-themes-bold :foreground ,date-common))) + `(ledger-font-periodic-xact-face ((,c :inherit font-lock-variable-name-face))) + `(ledger-font-posting-amount-face ((,c :inherit font-lock-constant-face))) + `(ledger-font-payee-cleared-face ((,c :inherit success))) + `(ledger-font-payee-pending-face ((,c :inherit warning))) + `(ledger-font-payee-uncleared-face ((,c :inherit error))) + `(ledger-font-xact-highlight-face ((,c :background ,bg-hl-line :extend t))) +;;;;; leerzeichen + `(leerzeichen ((,c :background ,bg-inactive))) +;;;;; line numbers (display-line-numbers-mode and global variant) + ;; Here we cannot inherit `modus-themes-fixed-pitch'. We need to + ;; fall back to `default' otherwise line numbers do not scale when + ;; using `text-scale-adjust'. + `(line-number ((,c :inherit ,(if modus-themes-mixed-fonts '(fixed-pitch default) 'default) :background ,bg-line-number-inactive :foreground ,fg-line-number-inactive))) + `(line-number-current-line ((,c :inherit (bold line-number) :background ,bg-line-number-active :foreground ,fg-line-number-active))) + `(line-number-major-tick ((,c :inherit line-number :foreground ,err))) + `(line-number-minor-tick ((,c :inherit line-number :foreground ,fg-alt))) +;;;;; magit + `(magit-bisect-bad ((,c :inherit error))) + `(magit-bisect-good ((,c :inherit success))) + `(magit-bisect-skip ((,c :inherit warning))) + `(magit-blame-date (( ))) + `(magit-blame-dimmed ((,c :inherit shadow))) + `(magit-blame-hash (( ))) + `(magit-blame-highlight ((,c :background ,bg-active :foreground ,fg-main))) + `(magit-blame-name (( ))) + `(magit-blame-summary (( ))) + `(magit-branch-local ((,c :foreground ,accent-0))) + `(magit-branch-remote ((,c :foreground ,accent-1))) + `(magit-branch-upstream ((,c :inherit italic))) + `(magit-branch-warning ((,c :inherit warning))) + `(magit-cherry-equivalent ((,c :foreground ,magenta))) + `(magit-cherry-unmatched ((,c :foreground ,cyan))) + `(magit-diff-added ((,c :background ,bg-added-faint :foreground ,fg-added))) + `(magit-diff-added-highlight ((,c :background ,bg-added :foreground ,fg-added))) + `(magit-diff-base ((,c :background ,bg-changed-faint :foreground ,fg-changed))) + `(magit-diff-base-highlight ((,c :background ,bg-changed :foreground ,fg-changed))) + `(magit-diff-context ((,c :inherit shadow))) + `(magit-diff-context-highlight ((,c :background ,bg-diff-context))) + `(magit-diff-file-heading ((,c :inherit bold :foreground ,accent-0))) + `(magit-diff-file-heading-highlight ((,c :inherit magit-diff-file-heading :background ,bg-inactive))) + `(magit-diff-file-heading-selection ((,c :inherit bold :background ,bg-hover-secondary))) + `(magit-diff-hunk-heading ((,c :background ,bg-inactive))) + `(magit-diff-hunk-heading-highlight ((,c :inherit bold :background ,bg-active))) + `(magit-diff-hunk-heading-selection ((,c :inherit bold :background ,bg-hover-secondary))) + `(magit-diff-hunk-region ((,c :inherit bold))) + `(magit-diff-lines-boundary ((,c :background ,fg-main))) + `(magit-diff-lines-heading ((,c :background ,fg-dim :foreground ,bg-main))) + `(magit-diff-removed ((,c :background ,bg-removed-faint :foreground ,fg-removed))) + `(magit-diff-removed-highlight ((,c :background ,bg-removed :foreground ,fg-removed))) + `(magit-diffstat-added ((,c :foreground ,fg-added-intense))) + `(magit-diffstat-removed ((,c :foreground ,fg-removed-intense))) + `(magit-dimmed ((,c :inherit shadow))) + `(magit-filename ((,c :foreground ,accent-2))) + `(magit-hash ((,c :foreground ,identifier))) + `(magit-head ((,c :inherit magit-branch-local))) + `(magit-header-line ((,c :inherit bold))) + `(magit-header-line-key ((,c :inherit modus-themes-key-binding))) + `(magit-header-line-log-select ((,c :inherit bold))) + `(magit-keyword ((,c :foreground ,keyword))) + `(magit-keyword-squash ((,c :inherit bold :foreground ,warning))) + `(magit-log-author ((,c :foreground ,name))) + `(magit-log-date ((,c :foreground ,date-common))) + `(magit-log-graph ((,c :inherit shadow))) + `(magit-mode-line-process ((,c :inherit bold :foreground ,modeline-info))) + `(magit-mode-line-process-error ((,c :inherit bold :foreground ,modeline-err))) + `(magit-process-ng ((,c :inherit error))) + `(magit-process-ok ((,c :inherit success))) + `(magit-reflog-amend ((,c :inherit warning))) + `(magit-reflog-checkout ((,c :inherit bold :foreground ,blue))) + `(magit-reflog-cherry-pick ((,c :inherit success))) + `(magit-reflog-commit ((,c :inherit bold))) + `(magit-reflog-merge ((,c :inherit success))) + `(magit-reflog-other ((,c :inherit bold :foreground ,cyan))) + `(magit-reflog-rebase ((,c :inherit bold :foreground ,magenta))) + `(magit-reflog-remote ((,c :inherit (bold magit-branch-remote)))) + `(magit-reflog-reset ((,c :inherit error))) + `(magit-refname ((,c :inherit shadow))) + `(magit-refname-pullreq ((,c :inherit shadow))) + `(magit-refname-stash ((,c :inherit shadow))) + `(magit-refname-wip ((,c :inherit shadow))) + `(magit-section ((,c :background ,bg-dim :foreground ,fg-main))) + `(magit-section-heading ((,c :inherit bold))) + `(magit-section-heading-selection ((,c :inherit bold :background ,bg-hover-secondary))) + `(magit-section-highlight ((,c :background ,bg-dim))) + `(magit-sequence-done ((,c :inherit success))) + `(magit-sequence-drop ((,c :inherit error))) + `(magit-sequence-exec ((,c :inherit bold :foreground ,magenta))) + `(magit-sequence-head ((,c :inherit bold :foreground ,cyan))) + `(magit-sequence-onto ((,c :inherit (bold shadow)))) + `(magit-sequence-part ((,c :inherit warning))) + `(magit-sequence-pick ((,c :inherit bold))) + `(magit-sequence-stop ((,c :inherit error))) + `(magit-signature-bad ((,c :inherit error))) + `(magit-signature-error ((,c :inherit error))) + `(magit-signature-expired ((,c :inherit warning))) + `(magit-signature-expired-key ((,c :foreground ,warning))) + `(magit-signature-good ((,c :inherit success))) + `(magit-signature-revoked ((,c :inherit bold :foreground ,warning))) + `(magit-signature-untrusted ((,c :inherit (bold shadow)))) + `(magit-tag ((,c :foreground ,accent-3))) ; compare with branches +;;;;; make-mode (makefiles) + `(makefile-makepp-perl ((,c :background ,bg-dim))) + `(makefile-space ((,c :background ,bg-inactive))) +;;;;; man + `(Man-overstrike ((,c :inherit bold :foreground ,accent-0))) + `(Man-underline ((,c :foreground ,accent-1 :underline t))) +;;;;; marginalia + `(marginalia-archive ((,c :foreground ,accent-0))) + `(marginalia-char ((,c :foreground ,accent-2))) + `(marginalia-date ((,c :foreground ,date-common))) + `(marginalia-documentation ((,c :inherit modus-themes-slant :foreground ,docstring))) + `(marginalia-file-name (( ))) + `(marginalia-file-owner ((,c :inherit shadow))) + `(marginalia-file-priv-dir ((,c :foreground ,accent-0))) + `(marginalia-file-priv-exec ((,c :foreground ,accent-1))) + `(marginalia-file-priv-link ((,c :foreground ,fg-link))) + `(marginalia-file-priv-no ((,c :inherit shadow))) + `(marginalia-file-priv-other ((,c :foreground ,accent-2))) + `(marginalia-file-priv-rare ((,c :foreground ,accent-3))) + `(marginalia-file-priv-read ((,c :foreground ,fg-main))) + `(marginalia-file-priv-write ((,c :foreground ,accent-0))) + `(marginalia-function ((,c :foreground ,fnname))) + `(marginalia-key ((,c :inherit modus-themes-key-binding))) + `(marginalia-lighter ((,c :inherit shadow))) + `(marginalia-liqst ((,c :inherit shadow))) + `(marginalia-mode ((,c :foreground ,constant))) + `(marginalia-modified ((,c :inherit warning))) + `(marginalia-null ((,c :inherit shadow))) + `(marginalia-number ((,c :foreground ,constant))) + `(marginalia-size ((,c :foreground ,variable))) + `(marginalia-string ((,c :foreground ,string))) + `(marginalia-symbol ((,c :foreground ,builtin))) + `(marginalia-true (( ))) + `(marginalia-type ((,c :foreground ,type))) + `(marginalia-value ((,c :inherit shadow))) + `(marginalia-version ((,c :foreground ,date-common))) +;;;;; markdown-mode + `(markdown-blockquote-face ((,c :inherit font-lock-doc-face))) + `(markdown-bold-face ((,c :inherit bold))) + `(markdown-code-face ((,c :inherit modus-themes-fixed-pitch :background ,bg-dim :extend t))) + `(markdown-gfm-checkbox-face ((,c :foreground ,warning))) + `(markdown-header-face (( ))) + `(markdown-header-face-1 ((,c :inherit modus-themes-heading-1))) + `(markdown-header-face-2 ((,c :inherit modus-themes-heading-2))) + `(markdown-header-face-3 ((,c :inherit modus-themes-heading-3))) + `(markdown-header-face-4 ((,c :inherit modus-themes-heading-4))) + `(markdown-header-face-5 ((,c :inherit modus-themes-heading-5))) + `(markdown-header-face-6 ((,c :inherit modus-themes-heading-6))) + `(markdown-highlighting-face ((,c :inherit secondary-selection))) + `(markdown-inline-code-face ((,c :inherit modus-themes-prose-code))) + `(markdown-italic-face ((,c :inherit italic))) + `(markdown-language-keyword-face ((,c :inherit modus-themes-fixed-pitch :foreground ,prose-block))) + `(markdown-line-break-face ((,c :inherit nobreak-space))) + `(markdown-link-face ((,c :inherit link))) + `(markdown-markup-face ((,c :inherit shadow))) + `(markdown-metadata-key-face ((,c :inherit bold))) + `(markdown-metadata-value-face ((,c :foreground ,string))) + `(markdown-missing-link-face ((,c :inherit warning))) + `(markdown-pre-face ((,c :inherit markdown-code-face))) + `(markdown-table-face ((,c :inherit modus-themes-fixed-pitch :foreground ,prose-table))) + `(markdown-url-face ((,c :foreground ,fg-alt))) +;;;;; markup-faces (`adoc-mode') + `(markup-attribute-face ((,c :inherit (modus-themes-slant markup-meta-face)))) + `(markup-bold-face ((,c :inherit bold))) + `(markup-code-face ((,c :foreground ,prose-code))) + `(markup-comment-face ((,c :inherit font-lock-comment-face))) + `(markup-complex-replacement-face ((,c :foreground ,prose-macro))) + `(markup-emphasis-face ((,c :inherit markup-italic-face))) + `(markup-error-face ((,c :inherit error))) + `(markup-gen-face ((,c :foreground ,prose-verbatim))) + `(markup-internal-reference-face ((,c :inherit (shadow modus-themes-slant)))) + `(markup-italic-face ((,c :inherit italic))) + `(markup-list-face ((,c :background ,bg-inactive))) + `(markup-meta-face ((,c :inherit (modus-themes-fixed-pitch shadow)))) + `(markup-meta-hide-face ((,c :foreground "gray50"))) + `(markup-reference-face ((,c :inherit modus-themes-slant :foreground ,fg-alt))) + `(markup-replacement-face ((,c :inherit modus-themes-fixed-pitch :foreground ,err))) + `(markup-secondary-text-face ((,c :height 0.9 :foreground ,fg-alt))) + `(markup-small-face ((,c :inherit markup-gen-face :height 0.9))) + `(markup-strong-face ((,c :inherit markup-bold-face))) + `(markup-subscript-face ((,c :height 0.9 :foreground ,fg-alt))) + `(markup-superscript-face ((,c :height 0.9 :foreground ,fg-alt))) + `(markup-table-cell-face (( ))) + `(markup-table-face ((,c :foreground ,prose-table))) + `(markup-table-row-face (( ))) + `(markup-title-0-face ((,c :inherit modus-themes-heading-1))) + `(markup-title-1-face ((,c :inherit modus-themes-heading-2))) + `(markup-title-2-face ((,c :inherit modus-themes-heading-3))) + `(markup-title-3-face ((,c :inherit modus-themes-heading-4))) + `(markup-title-4-face ((,c :inherit modus-themes-heading-5))) + `(markup-title-5-face ((,c :inherit modus-themes-heading-6))) + `(markup-verbatim-face ((,c :inherit modus-themes-fixed-pitch :foreground ,prose-verbatim))) +;;;;; messages + `(message-cited-text-1 ((,c :foreground ,mail-cite-0))) + `(message-cited-text-2 ((,c :foreground ,mail-cite-1))) + `(message-cited-text-3 ((,c :foreground ,mail-cite-2))) + `(message-cited-text-4 ((,c :foreground ,mail-cite-3))) + `(message-header-name ((,c :inherit bold))) + `(message-header-newsgroups ((,c :inherit message-header-other))) + `(message-header-to ((,c :inherit bold :foreground ,mail-recipient))) + `(message-header-cc ((,c :foreground ,mail-recipient))) + `(message-header-subject ((,c :inherit bold :foreground ,mail-subject))) + `(message-header-xheader ((,c :inherit message-header-other))) + `(message-header-other ((,c :foreground ,mail-other))) + `(message-mml ((,c :foreground ,mail-part))) + `(message-separator ((,c :background ,bg-active))) +;;;;; minimap + `(minimap-active-region-background ((,c :background ,bg-active))) + `(minimap-current-line-face ((,c :background ,bg-cyan-intense :foreground ,fg-main))) +;;;;; mode-line + `(mode-line ((,c :inherit modus-themes-ui-variable-pitch + :box ,border-mode-line-active + :background ,bg-mode-line-active + :foreground ,fg-mode-line-active))) + `(mode-line-active ((,c :inherit mode-line))) + `(mode-line-buffer-id ((,c :inherit bold))) + `(mode-line-emphasis ((,c :inherit bold :foreground ,modeline-info))) + `(mode-line-highlight ((,c :background ,bg-hover :foreground ,fg-main :box ,fg-main))) + `(mode-line-inactive ((,c :inherit modus-themes-ui-variable-pitch + :box ,border-mode-line-inactive + :background ,bg-mode-line-inactive + :foreground ,fg-mode-line-inactive))) +;;;;; mood-line + `(mood-line-modified ((,c :inherit italic))) + `(mood-line-status-error ((,c :inherit error))) + `(mood-line-status-info ((,c :foreground ,info))) + `(mood-line-status-neutral (( ))) + `(mood-line-status-success ((,c :inherit success))) + `(mood-line-status-warning ((,c :inherit warning))) + `(mood-line-unimportant ((,c :inherit shadow))) +;;;;; mpdel + `(mpdel-browser-directory-face ((,c :foreground ,accent-0))) + `(mpdel-playlist-current-song-face ((,c :inherit bold :foreground ,accent-0))) +;;;;; mu4e + `(mu4e-attach-number-face ((,c :inherit bold :foreground ,fg-dim))) + `(mu4e-cited-1-face ((,c :inherit message-cited-text-1))) + `(mu4e-cited-2-face ((,c :inherit message-cited-text-2))) + `(mu4e-cited-3-face ((,c :inherit message-cited-text-3))) + `(mu4e-cited-4-face ((,c :inherit message-cited-text-4))) + `(mu4e-cited-5-face ((,c :inherit message-cited-text-1))) + `(mu4e-cited-6-face ((,c :inherit message-cited-text-2))) + `(mu4e-cited-7-face ((,c :inherit message-cited-text-3))) + `(mu4e-compose-header-face ((,c :inherit mu4e-compose-separator-face))) + `(mu4e-compose-separator-face ((,c :inherit message-separator))) + `(mu4e-contact-face ((,c :inherit message-header-to))) + `(mu4e-context-face ((,c :inherit bold))) + `(mu4e-draft-face ((,c :foreground ,warning))) + `(mu4e-flagged-face ((,c :foreground ,err))) + `(mu4e-footer-face ((,c :inherit italic :foreground ,fg-alt))) + `(mu4e-forwarded-face ((,c :inherit italic :foreground ,info))) + `(mu4e-header-face ((,c :inherit shadow))) + `(mu4e-header-highlight-face ((,c :background ,bg-hl-line :extend t))) + `(mu4e-header-key-face ((,c :inherit message-header-name))) + `(mu4e-header-marks-face ((,c :inherit mu4e-special-header-value-face))) + `(mu4e-header-title-face ((,c :foreground ,fg-alt))) + `(mu4e-header-value-face ((,c :inherit message-header-other))) + `(mu4e-highlight-face ((,c :inherit modus-themes-key-binding))) + `(mu4e-link-face ((,c :inherit link))) + `(mu4e-modeline-face (( ))) + `(mu4e-moved-face ((,c :inherit italic :foreground ,warning))) + `(mu4e-ok-face ((,c :inherit success))) + `(mu4e-region-code ((,c :foreground ,builtin))) + `(mu4e-related-face ((,c :inherit (italic shadow)))) + `(mu4e-replied-face ((,c :foreground ,info))) + `(mu4e-special-header-value-face ((,c :inherit message-header-subject))) + `(mu4e-system-face ((,c :inherit italic))) + `(mu4e-title-face (( ))) + `(mu4e-trashed-face ((,c :foreground ,err))) + `(mu4e-unread-face ((,c :inherit bold))) + `(mu4e-url-number-face ((,c :inherit shadow))) + `(mu4e-view-body-face (( ))) + `(mu4e-warning-face ((,c :inherit warning))) +;;;;; multiple-cursors + `(mc/cursor-bar-face ((,c :height 1 :foreground ,fg-main :background ,bg-main))) + `(mc/cursor-face ((,c :inverse-video t))) + `(mc/region-face ((,c :inherit region))) +;;;;; nerd-icons + `(nerd-icons-blue ((,c :foreground ,blue-cooler))) + `(nerd-icons-blue-alt ((,c :foreground ,blue-warmer))) + `(nerd-icons-cyan ((,c :foreground ,cyan))) + `(nerd-icons-cyan-alt ((,c :foreground ,cyan-warmer))) + `(nerd-icons-dblue ((,c :foreground ,blue-faint))) + `(nerd-icons-dcyan ((,c :foreground ,cyan-faint))) + `(nerd-icons-dgreen ((,c :foreground ,green-faint))) + `(nerd-icons-dmaroon ((,c :foreground ,magenta-faint))) + `(nerd-icons-dorange ((,c :foreground ,red-faint))) + `(nerd-icons-dpink ((,c :foreground ,magenta-faint))) + `(nerd-icons-dpurple ((,c :foreground ,magenta-cooler))) + `(nerd-icons-dred ((,c :foreground ,red))) + `(nerd-icons-dsilver ((,c :foreground ,cyan-faint))) + `(nerd-icons-dyellow ((,c :foreground ,yellow-faint))) + `(nerd-icons-green ((,c :foreground ,green))) + `(nerd-icons-lblue ((,c :foreground ,blue-cooler))) + `(nerd-icons-lcyan ((,c :foreground ,cyan))) + `(nerd-icons-lgreen ((,c :foreground ,green-warmer))) + `(nerd-icons-lmaroon ((,c :foreground ,magenta-warmer))) + `(nerd-icons-lorange ((,c :foreground ,red-warmer))) + `(nerd-icons-lpink ((,c :foreground ,magenta))) + `(nerd-icons-lpurple ((,c :foreground ,magenta-faint))) + `(nerd-icons-lred ((,c :foreground ,red-faint))) + `(nerd-icons-lsilver ((,c :foreground "gray50"))) + `(nerd-icons-lyellow ((,c :foreground ,yellow-warmer))) + `(nerd-icons-maroon ((,c :foreground ,magenta))) + `(nerd-icons-orange ((,c :foreground ,yellow-warmer))) + `(nerd-icons-pink ((,c :foreground ,magenta-warmer))) + `(nerd-icons-purple ((,c :foreground ,magenta-cooler))) + `(nerd-icons-purple-alt ((,c :foreground ,blue-warmer))) + `(nerd-icons-red ((,c :foreground ,red))) + `(nerd-icons-red-alt ((,c :foreground ,red-cooler))) + `(nerd-icons-silver ((,c :foreground "gray50"))) + `(nerd-icons-yellow ((,c :foreground ,yellow))) +;;;;; nerd-icons-completion + `(nerd-icons-completion-dir-face ((,c :foreground ,cyan-faint))) +;;;;; nerd-icons-dired + `(nerd-icons-dired-dir-face ((,c :foreground ,cyan-faint))) +;;;;; nerd-icons-ibuffer + `(nerd-icons-ibuffer-dir-face ((,c :foreground ,cyan-faint))) + `(nerd-icons-ibuffer-file-face ((,c :foreground ,blue-faint))) + `(nerd-icons-ibuffer-mode-face ((,c :foreground ,cyan))) + `(nerd-icons-ibuffer-size-face ((,c :foreground ,cyan-cooler))) +;;;;; neotree + `(neo-banner-face ((,c :foreground ,accent-0))) + `(neo-button-face ((,c :inherit button))) + `(neo-dir-link-face (( ))) + `(neo-expand-btn-face (( ))) + `(neo-file-link-face (( ))) + `(neo-header-face ((,c :inherit bold))) + `(neo-root-dir-face ((,c :inherit bold :foreground ,accent-0))) + `(neo-vc-added-face ((,c :inherit success))) + `(neo-vc-conflict-face ((,c :inherit error))) + `(neo-vc-default-face (( ))) + `(neo-vc-edited-face ((,c :inherit italic))) + `(neo-vc-ignored-face ((,c :inherit shadow))) + `(neo-vc-missing-face ((,c :inherit error))) + `(neo-vc-needs-merge-face ((,c :inherit italic))) + `(neo-vc-needs-update-face ((,c :underline t))) + `(neo-vc-removed-face ((,c :strike-through t))) + `(neo-vc-unlocked-changes-face ((,c :inherit success))) + `(neo-vc-up-to-date-face (( ))) + `(neo-vc-user-face ((,c :inherit warning))) +;;;;; notmuch + `(notmuch-crypto-decryption ((,c :inherit bold))) + `(notmuch-crypto-part-header ((,c :foreground ,mail-part))) ; like `message-mml' + `(notmuch-crypto-signature-bad ((,c :inherit error))) + `(notmuch-crypto-signature-good ((,c :inherit success))) + `(notmuch-crypto-signature-good-key ((,c :inherit success))) + `(notmuch-crypto-signature-unknown ((,c :inherit warning))) + `(notmuch-jump-key ((,c :inherit modus-themes-key-binding))) + `(notmuch-message-summary-face ((,c :inherit bold :background ,bg-inactive))) + `(notmuch-search-count ((,c :foreground ,fg-dim))) + `(notmuch-search-date ((,c :foreground ,date-common))) + `(notmuch-search-flagged-face ((,c :foreground ,err))) + `(notmuch-search-matching-authors ((,c :foreground ,mail-recipient))) + `(notmuch-search-non-matching-authors ((,c :inherit shadow))) + `(notmuch-search-subject ((,c :foreground ,fg-main))) + `(notmuch-search-unread-face ((,c :inherit bold))) + `(notmuch-tag-added ((,c :underline ,info))) + `(notmuch-tag-deleted ((,c :strike-through ,err))) + `(notmuch-tag-face ((,c :foreground ,accent-0))) + `(notmuch-tag-flagged ((,c :foreground ,err))) + `(notmuch-tag-unread ((,c :foreground ,accent-1))) + `(notmuch-tree-match-author-face ((,c :inherit notmuch-search-matching-authors))) + `(notmuch-tree-match-date-face ((,c :inherit notmuch-search-date))) + `(notmuch-tree-match-face ((,c :foreground ,fg-main))) + `(notmuch-tree-match-tag-face ((,c :inherit notmuch-tag-face))) + `(notmuch-tree-no-match-face ((,c :inherit shadow))) + `(notmuch-tree-no-match-date-face ((,c :inherit shadow))) + `(notmuch-wash-cited-text ((,c :inherit message-cited-text-1))) + `(notmuch-wash-toggle-button ((,c :background ,bg-dim))) +;;;;; num3-mode + `(num3-face-even ((,c :inherit bold :background ,bg-inactive))) +;;;;; nxml-mode + `(nxml-attribute-colon ((,c :foreground ,fg-main))) + `(nxml-attribute-local-name ((,c :inherit font-lock-variable-name-face))) + `(nxml-attribute-prefix ((,c :inherit font-lock-type-face))) + `(nxml-attribute-value ((,c :inherit font-lock-constant-face))) + `(nxml-cdata-section-CDATA ((,c :inherit error))) + `(nxml-cdata-section-delimiter ((,c :inherit error))) + `(nxml-char-ref-delimiter ((,c :inherit shadow))) + `(nxml-char-ref-number ((,c :inherit (shadow modus-themes-bold)))) + `(nxml-delimited-data ((,c :inherit (shadow modus-themes-slant)))) + `(nxml-delimiter ((,c :foreground ,fg-dim))) + `(nxml-element-colon ((,c :foreground ,fg-main))) + `(nxml-element-local-name ((,c :inherit font-lock-function-name-face))) + `(nxml-element-prefix ((,c :inherit font-lock-builtin-face))) + `(nxml-entity-ref-delimiter ((,c :inherit shadow))) + `(nxml-entity-ref-name ((,c :inherit (shadow modus-themes-bold)))) + `(nxml-glyph ((,c :background ,bg-active :foreground ,fg-main))) + `(nxml-hash ((,c :inherit (bold font-lock-string-face)))) + `(nxml-heading ((,c :inherit bold))) + `(nxml-name ((,c :inherit font-lock-builtin-face))) + `(nxml-namespace-attribute-colon ((,c :foreground ,fg-main))) + `(nxml-namespace-attribute-prefix ((,c :inherit font-lock-variable-name-face))) + `(nxml-processing-instruction-target ((,c :inherit font-lock-keyword-face))) + `(nxml-prolog-keyword ((,c :inherit font-lock-keyword-face))) + `(nxml-ref ((,c :inherit (shadow modus-themes-bold)))) + `(rng-error ((,c :inherit error))) +;;;;; olivetti + `(olivetti-fringe ((,c :background ,bg-main))) +;;;;; orderless + `(orderless-match-face-0 ((,c :inherit modus-themes-completion-match-0))) + `(orderless-match-face-1 ((,c :inherit modus-themes-completion-match-1))) + `(orderless-match-face-2 ((,c :inherit modus-themes-completion-match-2))) + `(orderless-match-face-3 ((,c :inherit modus-themes-completion-match-3))) +;;;;; org + `(org-agenda-calendar-daterange ((,c :foreground ,date-range))) + `(org-agenda-calendar-event ((,c :foreground ,date-event))) + `(org-agenda-calendar-sexp ((,c :inherit (modus-themes-slant org-agenda-calendar-event)))) + `(org-agenda-clocking ((,c :inherit modus-themes-mark-alt))) + `(org-agenda-column-dateline ((,c :background ,bg-inactive))) + `(org-agenda-current-time ((,c :foreground ,date-now))) + `(org-agenda-date ((,c ,@(modus-themes--heading 'agenda-date date-weekday)))) + `(org-agenda-date-today ((,c :inherit org-agenda-date :underline t))) + `(org-agenda-date-weekend ((,c :inherit org-agenda-date :foreground ,date-weekend))) + `(org-agenda-date-weekend-today ((,c :inherit org-agenda-date-today :foreground ,date-weekend))) + `(org-agenda-diary ((,c :inherit org-agenda-calendar-sexp))) + `(org-agenda-dimmed-todo-face ((,c :inherit shadow))) + `(org-agenda-done ((,c :inherit org-done))) + `(org-agenda-filter-category ((,c :inherit bold :foreground ,modeline-err))) + `(org-agenda-filter-effort ((,c :inherit bold :foreground ,modeline-err))) + `(org-agenda-filter-regexp ((,c :inherit bold :foreground ,modeline-err))) + `(org-agenda-filter-tags ((,c :inherit bold :foreground ,modeline-err))) + `(org-agenda-restriction-lock ((,c :background ,bg-dim :foreground ,fg-dim))) + `(org-agenda-structure ((,c ,@(modus-themes--heading 'agenda-structure fg-alt)))) + `(org-agenda-structure-filter ((,c :inherit org-agenda-structure :foreground ,warning))) + `(org-agenda-structure-secondary ((,c :inherit font-lock-doc-face))) + `(org-archived ((,c :background ,bg-inactive :foreground ,fg-main))) + `(org-block ((,c ,@(modus-themes--org-block fg-main bg-dim)))) + `(org-block-begin-line ((,c ,@(modus-themes--org-block prose-block bg-inactive)))) + `(org-block-end-line ((,c :inherit org-block-begin-line))) + `(org-checkbox ((,c :foreground ,warning))) + `(org-checkbox-statistics-done ((,c :inherit org-done))) + `(org-checkbox-statistics-todo ((,c :inherit org-todo))) + `(org-clock-overlay ((,c :inherit secondary-selection))) + `(org-code ((,c :inherit modus-themes-prose-code))) + `(org-column ((,c :inherit default :background ,bg-dim))) + `(org-column-title ((,c :inherit (bold default) :underline t :background ,bg-dim))) + `(org-date ((,c :inherit modus-themes-fixed-pitch :foreground ,date-common))) + `(org-date-selected ((,c :foreground ,date-common :inverse-video t))) + `(org-document-info ((,c :foreground ,prose-metadata-value))) + `(org-document-info-keyword ((,c :inherit modus-themes-fixed-pitch :foreground ,prose-metadata))) + `(org-document-title ((,c :inherit modus-themes-heading-0))) + `(org-done ((,c :foreground ,prose-done))) + `(org-drawer ((,c :inherit modus-themes-fixed-pitch :foreground ,prose-metadata))) + `(org-ellipsis (( ))) ; inherits from the heading's color + `(org-footnote ((,c :inherit link))) + `(org-formula ((,c :inherit modus-themes-fixed-pitch :foreground ,fnname))) + `(org-headline-done ((,c :inherit org-done))) + `(org-headline-todo ((,c :inherit org-todo))) + `(org-hide ((,c :foreground ,bg-main))) + `(org-indent ((,c :inherit (fixed-pitch org-hide)))) + `(org-imminent-deadline ((,c :inherit modus-themes-bold :foreground ,date-deadline))) + `(org-latex-and-related ((,c :foreground ,type))) + `(org-level-1 ((,c :inherit modus-themes-heading-1))) + `(org-level-2 ((,c :inherit modus-themes-heading-2))) + `(org-level-3 ((,c :inherit modus-themes-heading-3))) + `(org-level-4 ((,c :inherit modus-themes-heading-4))) + `(org-level-5 ((,c :inherit modus-themes-heading-5))) + `(org-level-6 ((,c :inherit modus-themes-heading-6))) + `(org-level-7 ((,c :inherit modus-themes-heading-7))) + `(org-level-8 ((,c :inherit modus-themes-heading-8))) + `(org-link ((,c :inherit link))) + `(org-list-dt ((,c :inherit bold))) + `(org-macro ((,c :inherit modus-themes-prose-macro))) + `(org-meta-line ((,c :inherit modus-themes-fixed-pitch :foreground ,prose-metadata))) + `(org-mode-line-clock (( ))) + `(org-mode-line-clock-overrun ((,c :inherit bold :foreground ,modeline-err))) + `(org-priority ((,c :foreground ,prose-tag))) + `(org-property-value ((,c :inherit modus-themes-fixed-pitch :foreground ,prose-metadata-value))) + `(org-quote ((,c :inherit org-block))) + `(org-scheduled ((,c :foreground ,date-scheduled))) + `(org-scheduled-previously ((,c :inherit org-scheduled))) + `(org-scheduled-today ((,c :inherit (modus-themes-bold org-scheduled)))) + `(org-sexp-date ((,c :foreground ,date-common))) + `(org-special-keyword ((,c :inherit org-drawer))) + `(org-table ((,c :inherit modus-themes-fixed-pitch :foreground ,prose-table))) + `(org-table-header ((,c :inherit (bold org-table)))) + `(org-tag ((,c :foreground ,prose-tag))) + `(org-tag-group ((,c :inherit (bold org-tag)))) + `(org-target ((,c :underline t))) + `(org-time-grid ((,c :foreground ,fg-dim))) + `(org-todo ((,c :foreground ,prose-todo))) + `(org-upcoming-deadline ((,c :foreground ,date-deadline))) + `(org-upcoming-distant-deadline ((,c :inherit org-upcoming-deadline))) + `(org-verbatim ((,c :inherit modus-themes-prose-verbatim))) + `(org-verse ((,c :inherit org-block))) + `(org-warning ((,c :inherit warning))) +;;;;; org-habit + `(org-habit-alert-face ((,c :background ,bg-graph-yellow-0 :foreground "black"))) ; fg is special case + `(org-habit-alert-future-face ((,c :background ,bg-graph-yellow-1))) + `(org-habit-clear-face ((,c :background ,bg-graph-blue-0 :foreground "black"))) ; fg is special case + `(org-habit-clear-future-face ((,c :background ,bg-graph-blue-1))) + `(org-habit-overdue-face ((,c :background ,bg-graph-red-0))) + `(org-habit-overdue-future-face ((,c :background ,bg-graph-red-1))) + `(org-habit-ready-face ((,c :background ,bg-graph-green-0 :foreground "black"))) ; fg is special case + `(org-habit-ready-future-face ((,c :background ,bg-graph-green-1))) +;;;;; org-journal + `(org-journal-calendar-entry-face ((,c :inherit modus-themes-slant :foreground ,date-common))) + `(org-journal-calendar-scheduled-face ((,c :inherit (modus-themes-slant org-scheduled)))) + `(org-journal-highlight ((,c :foreground ,err))) +;;;;; org-noter + `(org-noter-no-notes-exist-face ((,c :inherit error))) + `(org-noter-notes-exist-face ((,c :inherit success))) +;;;;; org-pomodoro + `(org-pomodoro-mode-line ((,c :foreground ,err))) + `(org-pomodoro-mode-line-break ((,c :foreground ,info))) + `(org-pomodoro-mode-line-overtime ((,c :inherit error))) +;;;;; org-recur + `(org-recur ((,c :foreground ,fg-alt))) +;;;;; org-roam + `(org-roam-dim ((,c :foreground "gray50"))) + `(org-roam-olp ((,c :inherit shadow))) + `(org-roam-preview-heading ((,c :background ,bg-inactive))) + `(org-roam-preview-heading-highlight ((,c :background ,bg-active :foreground ,fg-main))) + `(org-roam-preview-region ((,c :inherit bold))) + `(org-roam-title ((,c :inherit bold))) +;;;;; org-superstar + `(org-superstar-item ((,c :foreground ,fg-main))) +;;;;; org-tree-slide + `(org-tree-slide-header-overlay-face ((,c :inherit org-document-title))) +;;;;; origami + `(origami-fold-header-face ((,c :background ,bg-dim :foreground ,fg-dim :box t))) + `(origami-fold-replacement-face ((,c :background ,bg-inactive :foreground ,fg-dim))) +;;;;; outline-mode + `(outline-1 ((,c :inherit modus-themes-heading-1))) + `(outline-2 ((,c :inherit modus-themes-heading-2))) + `(outline-3 ((,c :inherit modus-themes-heading-3))) + `(outline-4 ((,c :inherit modus-themes-heading-4))) + `(outline-5 ((,c :inherit modus-themes-heading-5))) + `(outline-6 ((,c :inherit modus-themes-heading-6))) + `(outline-7 ((,c :inherit modus-themes-heading-7))) + `(outline-8 ((,c :inherit modus-themes-heading-8))) +;;;;; outline-minor-faces + `(outline-minor-0 (())) +;;;;; package (M-x list-packages) + `(package-description ((,c :foreground ,docstring))) + `(package-help-section-name ((,c :inherit bold))) + `(package-name ((,c :inherit link))) + `(package-status-available ((,c :foreground ,date-common))) + `(package-status-avail-obso ((,c :inherit error))) + `(package-status-built-in ((,c :foreground ,builtin))) + `(package-status-dependency ((,c :foreground ,warning))) + `(package-status-disabled ((,c :inherit error :strike-through t))) + `(package-status-from-source ((,c :foreground ,type))) + `(package-status-held ((,c :foreground ,warning))) + `(package-status-incompat ((,c :inherit warning))) + `(package-status-installed ((,c :foreground ,fg-alt))) + `(package-status-new ((,c :inherit success))) + `(package-status-unsigned ((,c :inherit error))) +;;;;; page-break-lines + `(page-break-lines ((,c :inherit default :foreground "gray50"))) +;;;;; pandoc-mode + `(pandoc-citation-key-face ((,c :inherit font-lock-builtin-face))) + `(pandoc-directive-@@-face ((,c :inherit font-lock-keyword-face))) + `(pandoc-directive-braces-face ((,c :inherit font-lock-constant-face))) + `(pandoc-directive-contents-face ((,c :inherit font-lock-string-face))) + `(pandoc-directive-type-face ((,c :inherit font-lock-type-face))) +;;;;; paren-face + `(parenthesis ((,c :inherit shadow))) +;;;;; pass + `(pass-mode-directory-face ((,c :inherit bold :foreground ,accent-0))) + `(pass-mode-entry-face ((,c :background ,bg-main :foreground ,fg-main))) + `(pass-mode-header-face ((,c :inherit shadow))) +;;;;; pdf-tools + `(pdf-links-read-link ((,c :background ,fg-main :foreground ,bg-magenta-intense :inherit bold))) ; Foreground is background and vice versa + `(pdf-occur-document-face ((,c :inherit shadow))) + `(pdf-occur-page-face ((,c :inherit shadow))) +;;;;; persp-mode + `(persp-face-lighter-buffer-not-in-persp ((,c :inherit error))) + `(persp-face-lighter-default ((,c :inherit bold :foreground ,name))) + `(persp-face-lighter-nil-persp ((,c :inherit bold))) +;;;;; perspective + `(persp-selected-face ((,c :inherit bold :foreground ,name))) +;;;;; proced + `(proced-cpu ((,c :foreground ,keyword))) + `(proced-emacs-pid ((,c :foreground ,identifier :underline t))) + `(proced-executable ((,c :foreground ,name))) + `(proced-interruptible-sleep-status-code ((,c :inherit shadow))) + `(proced-mem ((,c :foreground ,type))) + `(proced-memory-high-usage ((,c :foreground ,err))) + `(proced-memory-low-usage ((,c :foreground ,info))) + `(proced-memory-medium-usage ((,c :foreground ,warning))) + `(proced-pgrp ((,c :inherit proced-pid))) + `(proced-pid ((,c :foreground ,identifier))) + `(proced-ppid ((,c :inherit proced-pid))) + `(proced-run-status-code ((,c :inherit success))) + `(proced-sess ((,c :inherit proced-pid))) + `(proced-session-leader-pid ((,c :inherit bold :foreground ,identifier))) + `(proced-time-colon (( ))) + `(proced-uninterruptible-sleep-status-code ((,c :inherit error))) + `(proced-user (( ))) +;;;;; popup + `(popup-face ((,c :background ,bg-inactive :foreground ,fg-main))) + `(popup-isearch-match ((,c :inherit modus-themes-search-current))) + `(popup-menu-mouse-face ((,c :inherit highlight))) + `(popup-menu-selection-face ((,c :inherit modus-themes-completion-selected))) + `(popup-scroll-bar-background-face ((,c :background ,bg-active))) + `(popup-scroll-bar-foreground-face (( ))) + `(popup-summary-face ((,c :background ,bg-active :foreground ,fg-dim))) + `(popup-tip-face ((,c :inherit modus-themes-intense-yellow))) +;;;;; powerline + `(powerline-active0 ((,c :background ,fg-dim :foreground ,bg-main))) + `(powerline-active1 ((,c :inherit mode-line))) + `(powerline-active2 ((,c :inherit mode-line-inactive))) + `(powerline-inactive0 ((,c :background ,bg-active :foreground ,fg-dim))) + `(powerline-inactive1 ((,c :background ,bg-main :foreground ,fg-dim))) + `(powerline-inactive2 ((,c :inherit mode-line-inactive))) +;;;;; powerline-evil + `(powerline-evil-base-face ((,c :background ,fg-main :foreground ,bg-main))) + `(powerline-evil-emacs-face ((,c :inherit bold :background ,bg-main))) + `(powerline-evil-insert-face ((,c :inherit success :background ,bg-main))) + `(powerline-evil-motion-face ((,c :inherit italic :background ,bg-main))) + `(powerline-evil-normal-face ((,c :background ,bg-main :foreground ,fg-alt))) + `(powerline-evil-operator-face ((,c :inherit warning :background ,bg-main))) + `(powerline-evil-replace-face ((,c :inherit error :background ,bg-main))) + `(powerline-evil-visual-face ((,c :inherit bold :background ,bg-main))) +;;;;; prescient + `(prescient-primary-highlight ((,c :inherit modus-themes-completion-match-0))) + `(prescient-secondary-highlight ((,c :inherit modus-themes-completion-match-1))) +;;;;; proced + `(proced-mark ((,c :inherit bold))) + `(proced-marked ((,c :inherit modus-themes-mark-alt))) + `(proced-sort-header ((,c :inherit bold :underline t))) +;;;;; prodigy + `(prodigy-green-face ((,c :inherit success))) + `(prodigy-red-face ((,c :inherit error))) + `(prodigy-yellow-face ((,c :inherit warning))) +;;;;; pulse + `(pulse-highlight-start-face ((,c :background ,bg-blue-intense :extend t))) +;;;;; pyim + `(pyim-page ((,c :background ,bg-active))) + `(pyim-page-selection ((,c :inherit bold :background ,bg-active :foreground ,info))) + `(pyim-page-subword ((,c :background ,bg-inactive))) +;;;;; quick-peek + `(quick-peek-background-face ((,c :background ,bg-inactive))) + `(quick-peek-border-face ((,c :background ,border :height 1))) + `(quick-peek-padding-face ((,c :background ,bg-inactive :height 0.15))) +;;;;; rainbow-delimiters + `(rainbow-delimiters-base-error-face ((,c :inherit modus-themes-prominent-error))) + `(rainbow-delimiters-base-face ((,c :foreground ,fg-main))) + `(rainbow-delimiters-depth-1-face ((,c :foreground ,rainbow-0))) + `(rainbow-delimiters-depth-2-face ((,c :foreground ,rainbow-1))) + `(rainbow-delimiters-depth-3-face ((,c :foreground ,rainbow-2))) + `(rainbow-delimiters-depth-4-face ((,c :foreground ,rainbow-3))) + `(rainbow-delimiters-depth-5-face ((,c :foreground ,rainbow-4))) + `(rainbow-delimiters-depth-6-face ((,c :foreground ,rainbow-5))) + `(rainbow-delimiters-depth-7-face ((,c :foreground ,rainbow-6))) + `(rainbow-delimiters-depth-8-face ((,c :foreground ,rainbow-7))) + `(rainbow-delimiters-depth-9-face ((,c :foreground ,rainbow-8))) + `(rainbow-delimiters-mismatched-face ((,c :inherit (bold modus-themes-prominent-warning)))) + `(rainbow-delimiters-unmatched-face ((,c :inherit (bold modus-themes-prominent-error)))) +;;;;; rcirc + `(rcirc-bright-nick ((,c :inherit bold :foreground ,accent-2))) + `(rcirc-dim-nick ((,c :inherit shadow))) + `(rcirc-monospace-text ((,c :inherit fixed-pitch))) + `(rcirc-my-nick ((,c :inherit bold :foreground ,accent-1))) + `(rcirc-nick-in-message ((,c :inherit rcirc-my-nick))) + `(rcirc-nick-in-message-full-line ((,c :inherit rcirc-my-nick))) + `(rcirc-other-nick ((,c :inherit bold :foreground ,accent-0))) + `(rcirc-prompt ((,c :inherit minibuffer-prompt))) + `(rcirc-server ((,c :inherit font-lock-comment-face))) + `(rcirc-timestamp ((,c :foreground ,date-common))) + `(rcirc-track-keyword ((,c :inherit bold :foreground ,modeline-warning))) + `(rcirc-track-nick ((,c :inherit rcirc-my-nick))) + `(rcirc-url ((,c :inherit link))) +;;;;; recursion-indicator + `(recursion-indicator-general ((,c :foreground ,modeline-err))) + `(recursion-indicator-minibuffer ((,c :foreground ,modeline-info))) +;;;;; regexp-builder (re-builder) + `(reb-match-0 ((,c :inherit modus-themes-intense-cyan))) + `(reb-match-1 ((,c :inherit modus-themes-subtle-magenta))) + `(reb-match-2 ((,c :inherit modus-themes-subtle-green))) + `(reb-match-3 ((,c :inherit modus-themes-intense-yellow))) + `(reb-regexp-grouping-backslash ((,c :inherit font-lock-regexp-grouping-backslash))) + `(reb-regexp-grouping-construct ((,c :inherit font-lock-regexp-grouping-construct))) +;;;;; rg (rg.el) + `(rg-column-number-face ((,c :inherit shadow))) + `(rg-context-face ((,c :inherit shadow))) + `(rg-error-face ((,c :inherit error))) + `(rg-file-tag-face ((,c :inherit font-lock-builtin-face))) + `(rg-filename-face ((,c :inherit bold :foreground ,name))) + `(rg-line-number-face ((,c :inherit shadow))) + `(rg-literal-face ((,c :inherit font-lock-constant-face))) + `(rg-match-face ((,c :inherit match))) + `(rg-regexp-face ((,c :foreground ,name))) + `(rg-toggle-off-face ((,c :inherit (shadow bold)))) + `(rg-toggle-on-face ((,c :inherit success))) + `(rg-warning-face ((,c :inherit warning))) +;;;;; ripgrep + `(ripgrep-context-face ((,c :inherit shadow))) + `(ripgrep-error-face ((,c :inherit error))) + `(ripgrep-hit-face ((,c :inherit success))) + `(ripgrep-match-face ((,c :inherit match))) +;;;;; rmail + `(rmail-header-name ((,c :inherit bold))) + `(rmail-highlight ((,c :inherit bold :foreground ,mail-other))) +;;;;; rst-mode + `(rst-level-1 ((,c :inherit modus-themes-heading-1))) + `(rst-level-2 ((,c :inherit modus-themes-heading-2))) + `(rst-level-3 ((,c :inherit modus-themes-heading-3))) + `(rst-level-4 ((,c :inherit modus-themes-heading-4))) + `(rst-level-5 ((,c :inherit modus-themes-heading-5))) + `(rst-level-6 ((,c :inherit modus-themes-heading-6))) +;;;;; ruler-mode + `(ruler-mode-column-number ((,c :inherit ruler-mode-default))) + `(ruler-mode-comment-column ((,c :inherit ruler-mode-default :foreground ,red))) + `(ruler-mode-current-column ((,c :inherit ruler-mode-default :background ,bg-active :foreground ,fg-main))) + `(ruler-mode-default ((,c :inherit default :background ,bg-dim :foreground ,fg-dim))) + `(ruler-mode-fill-column ((,c :inherit ruler-mode-default :foreground ,green))) + `(ruler-mode-fringes ((,c :inherit ruler-mode-default :foreground ,cyan))) + `(ruler-mode-goal-column ((,c :inherit ruler-mode-default :foreground ,blue))) + `(ruler-mode-margins ((,c :inherit ruler-mode-default :foreground ,bg-main))) + `(ruler-mode-pad ((,c :inherit ruler-mode-default :background ,bg-inactive :foreground ,fg-dim))) + `(ruler-mode-tab-stop ((,c :inherit ruler-mode-default :foreground ,yellow))) +;;;;; sesman + `(sesman-browser-button-face ((,c :inherit button))) + `(sesman-browser-highligh-face ((,c :inherit highlight))) + `(sesman-buffer-face ((,c :foreground ,accent-1))) + `(sesman-directory-face ((,c :inherit bold :foreground ,accent-0))) + `(sesman-project-face ((,c :inherit bold :foreground ,accent-2))) +;;;;; shell-script-mode + `(sh-heredoc ((,c :inherit font-lock-string-face))) + `(sh-quoted-exec ((,c :inherit font-lock-builtin-face))) +;;;;; shortdoc + `(shortdoc-heading ((,c :inherit bold))) + `(shortdoc-section (())) ; remove the default's variable-pitch style +;;;;; show-paren-mode + `(show-paren-match ((,c :background ,bg-paren-match :foreground ,fg-main :underline ,underline-paren-match))) + `(show-paren-match-expression ((,c :background ,bg-paren-expression))) + `(show-paren-mismatch ((,c :inherit modus-themes-prominent-error))) +;;;;; shr + `(shr-abbreviation ((,c :inherit modus-themes-lang-note))) + `(shr-code ((,c :inherit modus-themes-prose-verbatim))) + `(shr-h1 ((,c :inherit modus-themes-heading-1))) + `(shr-h2 ((,c :inherit modus-themes-heading-2))) + `(shr-h3 ((,c :inherit modus-themes-heading-3))) + `(shr-h4 ((,c :inherit modus-themes-heading-4))) + `(shr-h5 ((,c :inherit modus-themes-heading-5))) + `(shr-h6 ((,c :inherit modus-themes-heading-6))) + `(shr-selected-link ((,c :inherit modus-themes-mark-sel))) +;;;;; side-notes + `(side-notes ((,c :background ,bg-dim :foreground ,fg-dim))) +;;;;; sieve-mode + `(sieve-action-commands ((,c :inherit font-lock-builtin-face))) + `(sieve-control-commands ((,c :inherit font-lock-keyword-face))) + `(sieve-tagged-arguments ((,c :inherit font-lock-type-face))) + `(sieve-test-commands ((,c :inherit font-lock-function-name-face))) +;;;;; skewer-mode + `(skewer-error-face ((,c :inherit modus-themes-lang-error))) +;;;;; slime (sldb) + `(sldb-condition-face ((,c :inherit font-lock-preprocessor-face))) + `(sldb-restart-number-face ((,c :inherit bold))) + `(sldb-restart-type-face ((,c :inherit font-lock-type-face))) + `(sldb-restartable-frame-line-face ((,c :inherit success))) + `(sldb-section-face ((,c :inherit bold))) + `(slime-error-face ((,c :inherit modus-themes-lang-error))) + `(slime-note-face ((,c :underline t))) + `(slime-repl-input-face ((,c :inherit bold))) + `(slime-repl-inputed-output-face ((,c :inherit font-lock-string-face))) + `(slime-repl-output-mouseover-face ((,c :inherit highlight))) + `(slime-repl-prompt-face ((,c :inherit modus-themes-prompt))) + `(slime-style-warning-face ((,c :inherit modus-themes-lang-note))) + `(slime-warning-face ((,c :inherit modus-themes-lang-warning))) +;;;;; sly + `(sly-action-face ((,c :inherit font-lock-type-face))) + `(sly-db-condition-face ((,c :inherit font-lock-preprocessor-face))) + `(sly-db-restartable-frame-line-face ((,c :inherit success))) + `(sly-error-face ((,c :inherit modus-themes-lang-error))) + `(sly-mode-line ((,c :inherit mode-line-emphasis))) + `(sly-mrepl-output-face ((,c :inherit font-lock-string-face))) + `(sly-mrepl-output-face ((,c :inherit font-lock-string-face))) + `(sly-mrepl-prompt-face ((,c :inherit modus-themes-prompt))) + `(sly-note-face ((,c :inherit modus-themes-lang-note))) + `(sly-stickers-placed-face ((,c :background ,bg-inactive))) + `(sly-style-warning-face ((,c :inherit modus-themes-lang-note))) + `(sly-warning-face ((,c :inherit modus-themes-lang-warning))) +;;;;; smart-mode-line + `(sml/charging ((,c :foreground ,info))) + `(sml/discharging ((,c :foreground ,err))) + `(sml/filename ((,c :inherit bold :foreground ,name))) + `(sml/folder (( ))) + `(sml/git ((,c :inherit success))) + `(sml/global (( ))) + `(sml/line-number ((,c :inherit sml/global))) + `(sml/minor-modes ((,c :inherit sml/global))) + `(sml/modes ((,c :inherit bold))) + `(sml/modified ((,c :inherit italic))) + `(sml/mule-info ((,c :inherit sml/global))) + `(sml/name-filling ((,c :inherit warning))) + `(sml/not-modified ((,c :inherit sml/global))) + `(sml/numbers-separator ((,c :inherit sml/global))) + `(sml/outside-modified ((,c :inherit modus-themes-prominent-error))) + `(sml/position-percentage ((,c :inherit sml/global))) + `(sml/prefix ((,c :foreground ,fg-alt))) + `(sml/process ((,c :inherit sml/prefix))) + `(sml/projectile ((,c :inherit sml/git))) + `(sml/read-only (( ))) + `(sml/remote ((,c :inherit sml/global))) + `(sml/sudo ((,c :inherit warning))) + `(sml/time ((,c :inherit sml/global))) + `(sml/vc ((,c :inherit sml/git))) + `(sml/vc-edited ((,c :inherit italic))) +;;;;; smerge + `(smerge-base ((,c :inherit diff-changed))) + `(smerge-lower ((,c :inherit diff-added))) + `(smerge-markers ((,c :inherit diff-header))) + `(smerge-refined-added ((,c :inherit diff-refine-added))) + `(smerge-refined-changed (())) + `(smerge-refined-removed ((,c :inherit diff-refine-removed))) + `(smerge-upper ((,c :inherit diff-removed))) +;;;;; speedbar + `(speedbar-button-face ((,c :inherit button))) + `(speedbar-directory-face ((,c :inherit bold :foreground ,accent-0))) + `(speedbar-file-face ((,c :foreground ,fg-main))) + `(speedbar-highlight-face ((,c :inherit highlight))) + `(speedbar-selected-face ((,c :inherit modus-themes-mark-sel))) + `(speedbar-separator-face ((,c :background ,bg-active :foreground ,fg-main))) + `(speedbar-tag-face ((,c :foreground ,accent-1))) +;;;;; spell-fu + `(spell-fu-incorrect-face ((,c :inherit modus-themes-lang-error))) +;;;;; stripes + `(stripes ((,c :background ,bg-inactive))) +;;;;; suggest + `(suggest-heading ((,c :inherit warning))) +;;;;; switch-window + `(switch-window-background ((,c :background ,bg-inactive))) + `(switch-window-label ((,c :height 3.0 :foreground ,red-intense))) +;;;;; swiper + `(swiper-background-match-face-1 (( ))) + `(swiper-background-match-face-2 ((,c :inherit modus-themes-completion-match-0))) + `(swiper-background-match-face-3 ((,c :inherit modus-themes-completion-match-1))) + `(swiper-background-match-face-4 ((,c :inherit modus-themes-completion-match-2))) + `(swiper-line-face ((,c :background ,bg-hl-line :extend t))) + `(swiper-match-face-1 (( ))) + `(swiper-match-face-2 ((,c :inherit modus-themes-completion-match-0))) + `(swiper-match-face-3 ((,c :inherit modus-themes-completion-match-1))) + `(swiper-match-face-4 ((,c :inherit modus-themes-completion-match-2))) +;;;;; symbol-overlay + `(symbol-overlay-default-face ((,c :background ,bg-inactive))) + `(symbol-overlay-face-1 ((,c :inherit modus-themes-intense-blue))) + `(symbol-overlay-face-2 ((,c :inherit modus-themes-intense-magenta))) + `(symbol-overlay-face-3 ((,c :inherit modus-themes-intense-yellow))) + `(symbol-overlay-face-4 ((,c :inherit modus-themes-intense-magenta))) + `(symbol-overlay-face-5 ((,c :inherit modus-themes-intense-red))) + `(symbol-overlay-face-6 ((,c :inherit modus-themes-intense-red))) + `(symbol-overlay-face-7 ((,c :inherit modus-themes-intense-cyan))) + `(symbol-overlay-face-8 ((,c :inherit modus-themes-intense-cyan))) +;;;;; syslog-mode + `(syslog-debug ((,c :inherit italic))) + `(syslog-error ((,c :inherit error))) + `(syslog-file ((,c :inherit bold :foreground ,name))) + `(syslog-hide ((,c :background ,bg-main :foreground ,fg-main))) + `(syslog-hour ((,c :inherit bold :foreground ,date-common))) + `(syslog-info ((,c :inherit success))) + `(syslog-ip ((,c :inherit bold :foreground ,name :underline t))) + `(syslog-su ((,c :inherit error :underline t))) + `(syslog-warn ((,c :inherit warning))) +;;;;; tab-bar-mode + `(tab-bar ((,c :inherit modus-themes-ui-variable-pitch :background ,bg-tab-bar))) + `(tab-bar-tab-group-current ((,c :inherit bold :background ,bg-tab-current :box (:line-width -2 :color ,bg-tab-current) :foreground ,fg-alt))) + `(tab-bar-tab-group-inactive ((,c :background ,bg-tab-bar :box (:line-width -2 :color ,bg-tab-bar) :foreground ,fg-alt))) + `(tab-bar-tab ((,c :inherit bold :box (:line-width -2 :color ,bg-tab-current) :background ,bg-tab-current))) + `(tab-bar-tab-inactive ((,c :box (:line-width -2 :color ,bg-tab-other) :background ,bg-tab-other))) + `(tab-bar-tab-ungrouped ((,c :inherit tab-bar-tab-inactive))) +;;;;; tab-line-mode + `(tab-line ((,c :inherit modus-themes-ui-variable-pitch :background ,bg-tab-bar :height 0.95))) + `(tab-line-close-highlight ((,c :foreground ,err))) + `(tab-line-highlight ((,c :inherit highlight))) + `(tab-line-tab (( ))) + `(tab-line-tab-current ((,c :inherit bold :box (:line-width -2 :color ,bg-tab-current) :background ,bg-tab-current))) + `(tab-line-tab-inactive ((,c :box (:line-width -2 :color ,bg-tab-other) :background ,bg-tab-other))) + `(tab-line-tab-inactive-alternate ((,c :inherit tab-line-tab-inactive :foreground ,fg-alt))) + `(tab-line-tab-modified ((,c :foreground ,warning))) +;;;;; table (built-in table.el) + `(table-cell ((,c :background ,bg-dim))) +;;;;; telega + `(telega-button ((,c :box t :foreground ,fg-link))) + `(telega-button-active ((,c :box ,fg-link :background ,fg-link :foreground ,bg-main))) + `(telega-button-highlight ((,c :inherit secondary-selection))) + `(telega-chat-prompt ((,c :inherit modus-themes-prompt))) + `(telega-entity-type-code ((,c :inherit modus-themes-prose-verbatim))) + `(telega-entity-type-mention ((,c :foreground ,cyan))) + `(telega-entity-type-pre ((,c :inherit modus-themes-prose-code))) + `(telega-entity-type-spoiler ((,c :background ,fg-main :foreground ,fg-main))) + `(telega-msg-heading ((,c :background ,bg-inactive))) + `(telega-msg-self-title ((,c :inherit bold))) + `(telega-root-heading ((,c :background ,bg-inactive))) + `(telega-secret-title ((,c :foreground ,magenta-warmer))) + `(telega-unmuted-count ((,c :foreground ,blue-cooler))) + `(telega-user-online-status ((,c :foreground ,cyan))) + `(telega-username ((,c :foreground ,cyan-cooler))) + `(telega-webpage-chat-link ((,c :background ,bg-inactive))) + `(telega-webpage-fixed ((,c :inherit modus-themes-fixed-pitch :height 0.85))) + `(telega-webpage-header ((,c :inherit modus-themes-variable-pitch :height 1.3))) + `(telega-webpage-preformatted ((,c :inherit modus-themes-fixed-pitch :background ,bg-inactive))) + `(telega-webpage-subheader ((,c :inherit modus-themes-variable-pitch :height 1.15))) +;;;;; terraform-mode + `(terraform--resource-name-face ((,c :foreground ,keyword))) + `(terraform--resource-type-face ((,c :foreground ,type))) +;;;;; term + ;; NOTE 2023-08-10: `term-color-black' and `term-color-white' use + ;; the "bright" semantic color mappings to make sure they are + ;; distinct from `term'. + `(term ((,c :background ,bg-main :foreground ,fg-main))) + `(term-bold ((,c :inherit bold))) + `(term-color-black ((,c :background ,bg-term-black-bright :foreground ,fg-term-black-bright))) + `(term-color-blue ((,c :background ,bg-term-blue :foreground ,fg-term-blue))) + `(term-color-cyan ((,c :background ,bg-term-cyan :foreground ,fg-term-cyan))) + `(term-color-green ((,c :background ,bg-term-green :foreground ,fg-term-green))) + `(term-color-magenta ((,c :background ,bg-term-magenta :foreground ,fg-term-magenta))) + `(term-color-red ((,c :background ,bg-term-red :foreground ,fg-term-red))) + `(term-color-white ((,c :background ,bg-term-white-bright :foreground ,fg-term-white-bright))) + `(term-color-yellow ((,c :background ,bg-term-yellow :foreground ,fg-term-yellow))) + `(term-underline ((,c :underline t))) +;;;;; textsec + `(textsec-suspicious (( ))) +;;;;; transient + `(transient-active-infix ((,c :inherit highlight))) + `(transient-amaranth ((,c :inherit bold :foreground ,yellow-warmer))) + ;; Placate the compiler for what is a spurious warning. We also + ;; have to do this with `eldoc-highlight-function-argument'. + (list 'transient-argument `((,c :inherit (bold modus-themes-mark-alt)))) + `(transient-blue ((,c :inherit bold :foreground ,blue))) + `(transient-disabled-suffix ((,c :inherit modus-themes-mark-del))) + `(transient-enabled-suffix ((,c :inherit modus-themes-subtle-cyan))) + `(transient-heading ((,c :inherit bold :foreground ,fg-main))) + `(transient-inactive-argument ((,c :inherit shadow))) + `(transient-inactive-value ((,c :inherit shadow))) + `(transient-key ((,c :inherit modus-themes-key-binding))) + `(transient-mismatched-key ((,c :underline t))) + `(transient-nonstandard-key ((,c :underline t))) + `(transient-pink ((,c :inherit bold :foreground ,magenta))) + `(transient-purple ((,c :inherit bold :foreground ,magenta-cooler))) + `(transient-red ((,c :inherit bold :foreground ,red-faint))) + `(transient-teal ((,c :inherit bold :foreground ,cyan-cooler))) + `(transient-unreachable ((,c :inherit shadow))) + `(transient-unreachable-key ((,c :inherit shadow))) + `(transient-value ((,c :inherit (bold modus-themes-mark-sel)))) +;;;;; trashed + `(trashed-deleted ((,c :inherit modus-themes-mark-del))) + `(trashed-directory ((,c :foreground ,accent-0))) + `(trashed-mark ((,c :inherit bold))) + `(trashed-marked ((,c :inherit modus-themes-mark-alt))) + `(trashed-restored ((,c :inherit modus-themes-mark-sel))) +;;;;; tree-sitter + `(tree-sitter-hl-face:attribute ((,c :inherit font-lock-variable-name-face))) + `(tree-sitter-hl-face:constant.builtin ((,c :inherit tree-sitter-hl-face:constant))) + `(tree-sitter-hl-face:escape ((,c :inherit font-lock-regexp-grouping-backslash))) + `(tree-sitter-hl-face:function ((,c :inherit font-lock-function-name-face))) + `(tree-sitter-hl-face:function.call ((,c :inherit tree-sitter-hl-face:function))) + `(tree-sitter-hl-face:label (( ))) + `(tree-sitter-hl-face:method.call (( ))) + `(tree-sitter-hl-face:operator ((,c :inherit modus-themes-bold))) + `(tree-sitter-hl-face:property (( ))) + `(tree-sitter-hl-face:property.definition ((,c :inherit font-lock-variable-name-face))) + `(tree-sitter-hl-face:punctuation (( ))) + `(tree-sitter-hl-face:punctuation.bracket (( ))) + `(tree-sitter-hl-face:punctuation.delimiter (( ))) + `(tree-sitter-hl-face:punctuation.special ((,c :inherit font-lock-regexp-grouping-construct))) + `(tree-sitter-hl-face:string.special ((,c :inherit tree-sitter-hl-face:string))) + `(tree-sitter-hl-face:tag ((,c :inherit font-lock-function-name-face))) + `(tree-sitter-hl-face:type.argument (( ))) +;;;;; tty-menu + `(tty-menu-disabled-face ((,c :background ,bg-inactive :foreground ,fg-dim))) + `(tty-menu-enabled-face ((,c :inherit bold :background ,bg-inactive :foreground ,fg-main))) + `(tty-menu-selected-face ((,c :inherit modus-themes-intense-blue))) +;;;;; tuareg + `(caml-types-def-face ((,c :inherit modus-themes-subtle-red))) + `(caml-types-expr-face ((,c :inherit modus-themes-subtle-green))) + `(caml-types-occ-face ((,c :inherit modus-themes-subtle-green))) + `(caml-types-scope-face ((,c :inherit modus-themes-subtle-blue))) + `(caml-types-typed-face ((,c :inherit modus-themes-subtle-magenta))) + `(tuareg-font-double-semicolon-face ((,c :inherit font-lock-preprocessor-face))) + `(tuareg-font-lock-attribute-face ((,c :inherit font-lock-function-name-face))) + `(tuareg-font-lock-constructor-face ((,c :foreground ,fg-main))) + `(tuareg-font-lock-error-face ((,c :inherit (modus-themes-intense-red bold)))) + ;; `(tuareg-font-lock-extension-node-face ((,c :background ,bg-inactive :foreground ,magenta))) + `(tuareg-font-lock-governing-face ((,c :inherit bold :foreground ,fg-main))) + `(tuareg-font-lock-infix-extension-node-face ((,c :inherit font-lock-function-name-face))) + `(tuareg-font-lock-interactive-directive-face ((,c :inherit font-lock-preprocessor-face))) + `(tuareg-font-lock-interactive-error-face ((,c :inherit error))) + `(tuareg-font-lock-interactive-output-face ((,c :inherit font-lock-constant-face))) + `(tuareg-font-lock-label-face ((,c :inherit font-lock-type-face))) + `(tuareg-font-lock-line-number-face ((,c :inherit shadow))) + `(tuareg-font-lock-module-face ((,c :inherit font-lock-builtin-face))) + ;; `(tuareg-font-lock-multistage-face ((,c :inherit bold :background ,bg-inactive :foreground ,blue))) + `(tuareg-font-lock-operator-face ((,c :inherit font-lock-preprocessor-face))) + `(tuareg-opam-error-face ((,c :inherit error))) + `(tuareg-opam-pkg-variable-name-face ((,c :inherit font-lock-variable-name-face))) +;;;;; typescript + `(typescript-jsdoc-tag ((,c :inherit (font-lock-builtin-face font-lock-comment-face) :weight normal))) + `(typescript-jsdoc-type ((,c :inherit (font-lock-type-face font-lock-comment-face) :weight normal))) + `(typescript-jsdoc-value ((,c :inherit (font-lock-constant-face font-lock-comment-face) :weight normal))) +;;;;; undo-tree + `(undo-tree-visualizer-active-branch-face ((,c :inherit bold :foreground ,fg-main))) + `(undo-tree-visualizer-current-face ((,c :foreground ,blue-intense))) + `(undo-tree-visualizer-default-face ((,c :inherit shadow))) + `(undo-tree-visualizer-register-face ((,c :foreground ,magenta-intense))) + `(undo-tree-visualizer-unmodified-face ((,c :foreground ,green-intense))) +;;;;; vc (vc-dir.el, vc-hooks.el) + `(vc-dir-directory (( ))) + `(vc-dir-file ((,c :foreground ,name))) + `(vc-dir-header ((,c :inherit bold))) + `(vc-dir-header-value ((,c :foreground ,string))) + `(vc-dir-mark-indicator (( ))) + `(vc-dir-status-edited ((,c :inherit italic))) + `(vc-dir-status-ignored ((,c :inherit shadow))) + `(vc-dir-status-up-to-date ((,c :foreground ,info))) + `(vc-dir-status-warning ((,c :inherit error))) + `(vc-conflict-state ((,c :inherit error))) + `(vc-edited-state ((,c :inherit italic))) + `(vc-git-log-edit-summary-max-warning ((,c :inherit error))) + `(vc-git-log-edit-summary-target-warning ((,c :inherit warning))) + `(vc-locally-added-state ((,c :inherit italic))) + `(vc-locked-state ((,c :inherit success))) + `(vc-missing-state ((,c :inherit error))) + `(vc-needs-update-state ((,c :inherit error))) + `(vc-removed-state ((,c :inherit error))) + `(vc-state-base (( ))) + `(vc-up-to-date-state (( ))) +;;;;; vertico + `(vertico-current ((,c :inherit modus-themes-completion-selected))) +;;;;; vertico-quick + `(vertico-quick1 ((,c :inherit bold :background ,bg-char-0))) + `(vertico-quick2 ((,c :inherit bold :background ,bg-char-1))) +;;;;; vimish-fold + `(vimish-fold-fringe ((,c :foreground ,cyan))) + `(vimish-fold-mouse-face ((,c :inherit modus-themes-intense-blue))) + `(vimish-fold-overlay ((,c :background ,bg-inactive))) +;;;;; visible-mark + `(visible-mark-active ((,c :background ,bg-blue-intense))) + `(visible-mark-face1 ((,c :background ,bg-cyan-intense))) + `(visible-mark-face2 ((,c :background ,bg-yellow-intense))) + `(visible-mark-forward-face1 ((,c :background ,bg-magenta-intense))) + `(visible-mark-forward-face2 ((,c :background ,bg-green-intense))) +;;;;; visual-regexp + `(vr/group-0 ((,c :inherit modus-themes-intense-blue))) + `(vr/group-1 ((,c :inherit modus-themes-intense-magenta))) + `(vr/group-2 ((,c :inherit modus-themes-intense-green))) + `(vr/match-0 ((,c :inherit modus-themes-intense-yellow))) + `(vr/match-1 ((,c :inherit modus-themes-intense-yellow))) + `(vr/match-separator-face ((,c :inherit bold :background ,bg-active))) +;;;;; vterm + ;; NOTE 2023-08-10: `vterm-color-black' and `vterm-color-white' + ;; use the "bright" semantic color mappings to make sure they are + ;; distinct from `vterm-color-default'. + `(vterm-color-black ((,c :background ,bg-term-black :foreground ,fg-term-black))) + `(vterm-color-blue ((,c :background ,bg-term-blue :foreground ,fg-term-blue))) + `(vterm-color-cyan ((,c :background ,bg-term-cyan :foreground ,fg-term-cyan))) + `(vterm-color-default ((,c :background ,bg-main :foreground ,fg-main))) + `(vterm-color-green ((,c :background ,bg-term-green :foreground ,fg-term-green))) + `(vterm-color-inverse-video ((,c :background ,bg-main :inverse-video t))) + `(vterm-color-magenta ((,c :background ,bg-term-magenta :foreground ,fg-term-magenta))) + `(vterm-color-red ((,c :background ,bg-term-red :foreground ,fg-term-red))) + `(vterm-color-underline ((,c :underline t))) + `(vterm-color-white ((,c :background ,bg-term-white :foreground ,fg-term-white))) + `(vterm-color-yellow ((,c :background ,bg-term-yellow :foreground ,fg-term-yellow))) +;;;;; vundo + `(vundo-default ((,c :inherit shadow))) + `(vundo-highlight ((,c :inherit (bold vundo-node) :foreground ,red))) + `(vundo-last-saved ((,c :inherit (bold vundo-node) :foreground ,blue))) + `(vundo-saved ((,c :inherit vundo-node :foreground ,blue-intense))) +;;;;; wcheck-mode + `(wcheck-default-face ((,c :foreground ,red :underline t))) +;;;;; web-mode + `(web-mode-annotation-face ((,c :inherit web-mode-comment-face))) + `(web-mode-annotation-html-face ((,c :inherit web-mode-comment-face))) + `(web-mode-annotation-tag-face ((,c :inherit web-mode-comment-face :underline t))) + `(web-mode-block-attr-name-face ((,c :inherit font-lock-constant-face))) + `(web-mode-block-attr-value-face ((,c :inherit font-lock-type-face))) + `(web-mode-block-comment-face ((,c :inherit web-mode-comment-face))) + `(web-mode-block-control-face ((,c :inherit font-lock-builtin-face))) + `(web-mode-block-delimiter-face ((,c :foreground ,fg-main))) + `(web-mode-block-face ((,c :background ,bg-dim))) + `(web-mode-block-string-face ((,c :inherit web-mode-string-face))) + `(web-mode-bold-face ((,c :inherit bold))) + `(web-mode-builtin-face ((,c :inherit font-lock-builtin-face))) + `(web-mode-comment-face ((,c :inherit font-lock-comment-face))) + `(web-mode-comment-keyword-face ((,c :inherit font-lock-warning-face))) + `(web-mode-constant-face ((,c :inherit font-lock-constant-face))) + `(web-mode-css-at-rule-face ((,c :inherit font-lock-constant-face))) + `(web-mode-css-color-face ((,c :inherit font-lock-builtin-face))) + `(web-mode-css-comment-face ((,c :inherit web-mode-comment-face))) + `(web-mode-css-function-face ((,c :inherit font-lock-builtin-face))) + `(web-mode-css-priority-face ((,c :inherit font-lock-warning-face))) + `(web-mode-css-property-name-face ((,c :inherit font-lock-keyword-face))) + `(web-mode-css-pseudo-class-face ((,c :inherit font-lock-doc-face))) + `(web-mode-css-selector-face ((,c :inherit font-lock-keyword-face))) + `(web-mode-css-string-face ((,c :inherit web-mode-string-face))) + `(web-mode-css-variable-face ((,c :inherit font-lock-variable-name-face))) + `(web-mode-current-column-highlight-face ((,c :background ,bg-inactive))) + `(web-mode-current-element-highlight-face ((,c :inherit modus-themes-cyan-subtle))) + `(web-mode-doctype-face ((,c :inherit font-lock-doc-face))) + `(web-mode-error-face ((,c :inherit error))) + `(web-mode-filter-face ((,c :inherit font-lock-function-name-face))) + `(web-mode-folded-face ((,c :underline t))) + `(web-mode-function-call-face ((,c :inherit font-lock-function-name-face))) + `(web-mode-function-name-face ((,c :inherit font-lock-function-name-face))) + `(web-mode-html-attr-custom-face ((,c :inherit font-lock-variable-name-face))) + `(web-mode-html-attr-engine-face ((,c :foreground ,fg-main))) + `(web-mode-html-attr-equal-face ((,c :foreground ,fg-main))) + `(web-mode-html-attr-name-face ((,c :inherit font-lock-variable-name-face))) + `(web-mode-html-attr-value-face ((,c :inherit font-lock-constant-face))) + `(web-mode-html-entity-face ((,c :inherit font-lock-negation-char-face))) + `(web-mode-html-tag-bracket-face ((,c :foreground ,fg-dim))) + `(web-mode-html-tag-custom-face ((,c :inherit font-lock-function-name-face))) + `(web-mode-html-tag-face ((,c :inherit font-lock-function-name-face))) + `(web-mode-html-tag-namespaced-face ((,c :inherit font-lock-builtin-face))) + `(web-mode-html-tag-unclosed-face ((,c :inherit error :underline t))) + `(web-mode-inlay-face ((,c :background ,bg-inactive))) + `(web-mode-italic-face ((,c :inherit italic))) + `(web-mode-javascript-comment-face ((,c :inherit web-mode-comment-face))) + `(web-mode-javascript-string-face ((,c :inherit web-mode-string-face))) + `(web-mode-json-comment-face ((,c :inherit web-mode-comment-face))) + `(web-mode-json-context-face ((,c :inherit font-lock-builtin-face))) + `(web-mode-json-key-face ((,c :foreground ,blue-faint))) + `(web-mode-json-string-face ((,c :inherit web-mode-string-face))) + `(web-mode-keyword-face ((,c :inherit font-lock-keyword-face))) + `(web-mode-param-name-face ((,c :inherit font-lock-function-name-face))) + `(web-mode-part-comment-face ((,c :inherit web-mode-comment-face))) + `(web-mode-part-face ((,c :inherit web-mode-block-face))) + `(web-mode-part-string-face ((,c :inherit web-mode-string-face))) + `(web-mode-preprocessor-face ((,c :inherit font-lock-preprocessor-face))) + `(web-mode-script-face ((,c :inherit web-mode-part-face))) + `(web-mode-sql-keyword-face ((,c :inherit font-lock-negation-char-face))) + `(web-mode-string-face ((,c :inherit font-lock-string-face))) + `(web-mode-style-face ((,c :inherit web-mode-part-face))) + `(web-mode-symbol-face ((,c :inherit font-lock-constant-face))) + `(web-mode-type-face ((,c :inherit font-lock-builtin-face))) + `(web-mode-underline-face ((,c :underline t))) + `(web-mode-variable-name-face ((,c :inherit font-lock-variable-name-face))) + `(web-mode-warning-face ((,c :inherit warning))) + `(web-mode-whitespace-face ((,c :background ,bg-inactive))) +;;;;; wgrep + `(wgrep-delete-face ((,c :inherit warning))) + `(wgrep-done-face ((,c :inherit success))) + `(wgrep-face ((,c :inherit bold))) + `(wgrep-file-face ((,c :foreground ,fg-alt))) + `(wgrep-reject-face ((,c :inherit error))) +;;;;; which-function-mode + `(which-func ((,c :inherit bold :foreground ,modeline-info))) ; same as `breadcrumb-imenu-leaf-face' +;;;;; which-key + `(which-key-command-description-face ((,c :foreground ,fg-main))) + `(which-key-group-description-face ((,c :foreground ,keyword))) + `(which-key-highlighted-command-face ((,c :foreground ,warning :underline t))) + `(which-key-key-face ((,c :inherit modus-themes-key-binding))) + `(which-key-local-map-description-face ((,c :foreground ,fg-main))) + `(which-key-note-face ((,c :inherit shadow))) + `(which-key-separator-face ((,c :inherit shadow))) + `(which-key-special-key-face ((,c :inherit error))) +;;;;; whitespace-mode + `(whitespace-big-indent ((,c :background ,bg-space-err))) + `(whitespace-empty ((,c :inherit modus-themes-intense-magenta))) + `(whitespace-hspace ((,c :background ,bg-space :foreground ,fg-space))) + `(whitespace-indentation ((,c :background ,bg-space :foreground ,fg-space))) + `(whitespace-line ((,c :background ,bg-space :foreground ,warning))) + `(whitespace-newline ((,c :background ,bg-space :foreground ,fg-space))) + `(whitespace-space ((,c :background ,bg-space :foreground ,fg-space))) + `(whitespace-space-after-tab ((,c :inherit modus-themes-subtle-magenta))) + `(whitespace-space-before-tab ((,c :inherit modus-themes-subtle-cyan))) + `(whitespace-tab ((,c :background ,bg-space :foreground ,fg-space))) + `(whitespace-trailing ((,c :background ,bg-space-err))) +;;;;; window-divider-mode + `(window-divider ((,c :foreground ,border))) + `(window-divider-first-pixel ((,c :foreground ,bg-inactive))) + `(window-divider-last-pixel ((,c :foreground ,bg-inactive))) +;;;;; widget + `(widget-button ((,c :inherit bold :foreground ,fg-link))) + `(widget-button-pressed ((,c :inherit widget-button :foreground ,fg-link-visited))) + `(widget-documentation ((,c :inherit font-lock-doc-face))) + `(widget-field ((,c :background ,bg-inactive :foreground ,fg-main :extend nil))) + `(widget-inactive ((,c :background ,bg-button-inactive :foreground ,fg-button-inactive))) + `(widget-single-line-field ((,c :inherit widget-field))) +;;;;; writegood-mode + `(writegood-duplicates-face ((,c :inherit modus-themes-lang-error))) + `(writegood-passive-voice-face ((,c :inherit modus-themes-lang-warning))) + `(writegood-weasels-face ((,c :inherit modus-themes-lang-warning))) +;;;;; woman + `(woman-addition ((,c :foreground ,accent-2))) + `(woman-bold ((,c :inherit bold :foreground ,accent-0))) + `(woman-italic ((,c :inherit italic :foreground ,accent-1))) + `(woman-unknown ((,c :foreground ,accent-3))) +;;;;; xah-elisp-mode + `(xah-elisp-at-symbol ((,c :inherit font-lock-warning-face))) + `(xah-elisp-cap-variable ((,c :inherit font-lock-preprocessor-face))) + `(xah-elisp-command-face ((,c :inherit font-lock-type-face))) + `(xah-elisp-dollar-symbol ((,c :inherit font-lock-variable-name-face))) +;;;;; yaml-mode + `(yaml-tab-face ((,c :background ,bg-space-err))) +;;;;; yasnippet + `(yas-field-highlight-face ((,c :inherit highlight)))) + "Face specs for use with `modus-themes-theme'.") + +(defconst modus-themes-custom-variables + '( +;;;; ansi-colors + `(ansi-color-faces-vector [default bold shadow italic underline success warning error]) + `(ansi-color-names-vector ["gray35" ,red ,green ,yellow ,blue ,magenta ,cyan "gray65"]) +;;;; chart + `(chart-face-color-list + '( ,bg-graph-red-0 ,bg-graph-green-0 ,bg-graph-yellow-0 ,bg-graph-blue-0 ,bg-graph-magenta-0 ,bg-graph-cyan-0 + ,bg-graph-red-1 ,bg-graph-green-1 ,bg-graph-yellow-1 ,bg-graph-blue-1 ,bg-graph-magenta-1 ,bg-graph-cyan-1)) +;;;; exwm + `(exwm-floating-border-color ,border) +;;;; flymake fringe indicators + `(flymake-error-bitmap '(flymake-double-exclamation-mark modus-themes-prominent-error)) + `(flymake-warning-bitmap '(exclamation-mark modus-themes-prominent-warning)) + `(flymake-note-bitmap '(exclamation-mark modus-themes-prominent-note)) +;;;; highlight-changes + `(highlight-changes-colors nil) + `(highlight-changes-face-list '(success warning error bold bold-italic)) +;;;; ibuffer + `(ibuffer-deletion-face 'modus-themes-mark-del) + `(ibuffer-filter-group-name-face 'bold) + `(ibuffer-marked-face 'modus-themes-mark-sel) + `(ibuffer-title-face 'default) +;;;; hl-todo + `(hl-todo-keyword-faces + '(("HOLD" . ,warning) + ("TODO" . ,err) + ("NEXT" . ,fg-alt) + ("THEM" . ,fg-alt) + ("PROG" . ,info) + ("OKAY" . ,info) + ("DONT" . ,warning) + ("FAIL" . ,err) + ("BUG" . ,err) + ("DONE" . ,info) + ("NOTE" . ,warning) + ("KLUDGE" . ,warning) + ("HACK" . ,warning) + ("TEMP" . ,warning) + ("FIXME" . ,err) + ("XXX+" . ,err) + ("REVIEW" . ,info) + ("DEPRECATED" . ,info))) +;;;; pdf-tools + `(pdf-view-midnight-colors '(,fg-main . ,bg-dim)) +;;;; rcirc-color + `(rcirc-colors + '(modus-themes-fg-red + modus-themes-fg-green + modus-themes-fg-blue + modus-themes-fg-yellow + modus-themes-fg-magenta + modus-themes-fg-cyan + modus-themes-fg-red-warmer + modus-themes-fg-green-warmer + modus-themes-fg-blue-warmer + modus-themes-fg-yellow-warmer + modus-themes-fg-magenta-warmer + modus-themes-fg-cyan-warmer + modus-themes-fg-red-cooler + modus-themes-fg-green-cooler + modus-themes-fg-blue-cooler + modus-themes-fg-yellow-cooler + modus-themes-fg-magenta-cooler + modus-themes-fg-cyan-cooler + modus-themes-fg-red-faint + modus-themes-fg-green-faint + modus-themes-fg-blue-faint + modus-themes-fg-yellow-faint + modus-themes-fg-magenta-faint + modus-themes-fg-cyan-faint + modus-themes-fg-red-intense + modus-themes-fg-green-intense + modus-themes-fg-blue-intense + modus-themes-fg-yellow-intense + modus-themes-fg-magenta-intense + modus-themes-fg-cyan-intense)) +;;;; org-src-block-faces + (if (or (eq modus-themes-org-blocks 'tinted-background) + (eq modus-themes-org-blocks 'rainbow)) + `(org-src-block-faces + `(("emacs-lisp" modus-themes-nuanced-magenta) + ("elisp" modus-themes-nuanced-magenta) + ("clojure" modus-themes-nuanced-magenta) + ("clojurescript" modus-themes-nuanced-magenta) + ("c" modus-themes-nuanced-blue) + ("c++" modus-themes-nuanced-blue) + ("sh" modus-themes-nuanced-green) + ("shell" modus-themes-nuanced-green) + ("html" modus-themes-nuanced-yellow) + ("xml" modus-themes-nuanced-yellow) + ("css" modus-themes-nuanced-red) + ("scss" modus-themes-nuanced-red) + ("python" modus-themes-nuanced-green) + ("ipython" modus-themes-nuanced-magenta) + ("r" modus-themes-nuanced-cyan) + ("yaml" modus-themes-nuanced-cyan) + ("conf" modus-themes-nuanced-cyan) + ("docker" modus-themes-nuanced-cyan))) + `(org-src-block-faces '()))) + "Custom variables for `modus-themes-theme'.") + +;;; Theme macros + +;;;; Instantiate a Modus theme + +;;;###autoload +(defmacro modus-themes-theme (name palette &optional overrides) + "Bind NAME's color PALETTE around face specs and variables. +Face specifications are passed to `custom-theme-set-faces'. +While variables are handled by `custom-theme-set-variables'. +Those are stored in `modus-themes-faces' and +`modus-themes-custom-variables' respectively. + +Optional OVERRIDES are appended to PALETTE, overriding +corresponding entries." + (declare (indent 0)) + (let ((sym (gensym)) + (colors (mapcar #'car (symbol-value palette)))) + `(let* ((c '((class color) (min-colors 256))) + (,sym (modus-themes--palette-value ',name ',overrides)) + ,@(mapcar (lambda (color) + (list color + `(modus-themes--retrieve-palette-value ',color ,sym))) + colors)) + (ignore c ,@colors) ; Silence unused variable warnings + (custom-theme-set-faces ',name ,@modus-themes-faces) + (custom-theme-set-variables ',name ,@modus-themes-custom-variables)))) + +;;;; Use theme colors + +(defmacro modus-themes-with-colors (&rest body) + "Evaluate BODY with colors from current palette bound." + (declare (indent 0)) + (let* ((sym (gensym)) + ;; NOTE 2022-08-23: We just give it a sample palette at this + ;; stage. It only needs to collect each car. Then we + ;; instantiate the actual theme's palette. We have to do this + ;; otherwise the macro does not work properly when called from + ;; inside a function. + (colors (mapcar #'car (modus-themes--current-theme-palette)))) + `(let* ((c '((class color) (min-colors 256))) + (,sym (modus-themes--current-theme-palette :overrides)) + ,@(mapcar (lambda (color) + (list color + `(modus-themes--retrieve-palette-value ',color ,sym))) + colors)) + (ignore c ,@colors) ; Silence unused variable warnings + ,@body))) + +;;;; Add themes from package to path + +;;;###autoload +(when load-file-name + (let ((dir (file-name-directory load-file-name))) + (unless (equal dir (expand-file-name "themes/" data-directory)) + (add-to-list 'custom-theme-load-path dir)))) + +(provide 'modus-themes) +;;; modus-themes.el ends here diff --git a/elpa/modus-themes-4.3.0/modus-themes.info b/elpa/modus-themes-4.3.0/modus-themes.info @@ -0,0 +1,6278 @@ +This is docGYh7V6.info, produced by makeinfo version 6.8 from +modus-themes.texi. + +Copyright (C) 2020-2023 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being “A GNU Manual,” and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + “GNU Free Documentation License.” + + (a) The FSF’s Back-Cover Text is: “You have the freedom to copy and + modify this GNU manual.” + +INFO-DIR-SECTION Emacs misc features +START-INFO-DIR-ENTRY +* Modus Themes: (modus-themes). Elegant, highly legible and customizable themes. +END-INFO-DIR-ENTRY + + +File: docGYh7V6.info, Node: Top, Next: Overview, Up: (dir) + +Modus themes for GNU Emacs +************************** + +Copyright (C) 2020-2023 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being “A GNU Manual,” and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + “GNU Free Documentation License.” + + (a) The FSF’s Back-Cover Text is: “You have the freedom to copy and + modify this GNU manual.” + + This manual, written by Protesilaos Stavrou, describes the +customization options for the Modus themes, and provides every other +piece of information pertinent to them. + + The documentation furnished herein corresponds to stable version +4.3.0, released on 2023-09-19. Any reference to a newer feature which +does not yet form part of the latest tagged commit, is explicitly marked +as such. + + Current development target is 4.4.0-dev. + + • Package name (GNU ELPA): ‘modus-themes’ + • Official manual: <https://protesilaos.com/emacs/modus-themes> + • Change log: <https://protesilaos.com/emacs/modus-themes-changelog> + • Color palette: <https://protesilaos.com/emacs/modus-themes-colors> + • Sample pictures: + <https://protesilaos.com/emacs/modus-themes-pictures> + • Git repo on SourceHut: + <https://git.sr.ht/~protesilaos/modus-themes> + • Mirrors: + • GitHub: <https://github.com/protesilaos/modus-themes> + • GitLab: <https://gitlab.com/protesilaos/modus-themes> + • Mailing list: <https://lists.sr.ht/~protesilaos/modus-themes> + • Backronym: My Old Display Unexpectedly Sharpened ... themes + +* Menu: + +* Overview:: +* Installation:: +* Enable and load:: +* Customization options:: +* Advanced customization:: +* Face coverage:: +* Notes on individual packages:: +* Frequently Asked Questions:: +* Contributing:: +* Acknowledgements:: +* GNU Free Documentation License:: +* Indices:: + +— The Detailed Node Listing — + +Overview + +* How do the themes look like:: +* Learn about the latest changes:: + +Installation + +* Install manually from source:: +* Install from the archives:: +* Install on GNU/Linux:: +* Dealing with byte compilation errors:: + +Install on GNU/Linux + +* Debian 11 Bullseye:: +* GNU Guix:: + +Enable and load + +* The require-theme for built-in Emacs themes:: +* Sample configuration with and without use-package:: +* Differences between loading and enabling:: + +Customization options + +* Custom reload theme:: Toggle auto-reload of the theme when setting custom variables +* Disable other themes:: Determine whether loading a Modus themes disables all others +* Bold constructs:: Toggle bold constructs in code +* Italic constructs:: Toggle italic font constructs in code +* Mixed fonts:: Toggle mixing of font families +* Command prompts:: Control the style of command prompts +* Completion UIs:: Choose among several styles for completion UIs +* Org mode blocks:: Choose among plain, gray, or tinted backgrounds +* Heading styles:: Choose among several styles, also per heading level +* UI typeface:: Toggle the use of variable-pitch across the User Interface +* Palette overrides:: Refashion color values and/or semantic color mappings + +Advanced customization + +* Palette override presets:: +* Stylistic variants using palette overrides:: +* More accurate colors in terminal emulators:: +* Range of color with terminal emulators:: +* Preview theme colors:: +* Per-theme customization settings:: +* Get a single color from the palette:: +* Use theme colors in code with modus-themes-with-colors:: +* Do not extend the region background:: +* Add padding to mode line:: +* Remap face with local value:: +* Font configurations for Org and others:: +* Configure bold and italic faces:: +* Custom Org todo keyword and priority faces:: +* Custom Org emphasis faces:: +* Update Org block delimiter fontification:: +* Measure color contrast:: +* Load theme depending on time of day:: +* Backdrop for pdf-tools:: +* Toggle themes without reloading them:: +* A theme-agnostic hook for theme loading:: +* Use more spacious margins or padding in Emacs frames:: +* Custom hl-todo colors:: +* Add support for solaire-mode:: + +Stylistic variants using palette overrides + +* Make the mode line borderless:: +* Make the active mode line colorful:: +* Make the tab bar more or less colorful:: +* Make the fringe invisible or another color:: +* Make links use subtle or no underlines:: +* Make prompts more or less colorful:: +* Make completion matches more or less colorful:: +* Make comments yellow and strings green:: +* Make code syntax use the old alt-syntax style:: +* Make use of alternative styles for code syntax:: +* Make matching parenthesis more or less intense:: +* Make box buttons more or less gray:: +* Make TODO and DONE more or less intense:: +* Make headings more or less colorful:: +* Make Org agenda more or less colorful:: +* Make inline code in prose use alternative styles:: +* Make mail citations and headers more or less colorful:: +* Make the region preserve text colors, plus other styles: Make the region preserve text colors plus other styles. +* Make mouse highlights more or less colorful:: +* Make language underlines less colorful:: +* Make line numbers use alternative styles:: +* Make diffs use only a foreground:: +* Make deuteranopia diffs red and blue instead of yellow and blue:: +* Make the themes look like what the maintainer uses:: + +Face coverage + +* Supported packages:: Full list of covered face groups +* Indirectly covered packages:: + +Notes on individual packages + +* Note on calendar.el weekday and weekend colors: Note on calendarel weekday and weekend colors. +* Note on git-gutter in Doom Emacs:: +* Note on php-mode multiline comments:: +* Note on underlines in compilation buffers:: +* Note on inline Latex in Org buffers:: +* Note on dimmer.el: Note on dimmerel. +* Note on display-fill-column-indicator-mode:: +* Note on highlight-parentheses.el: Note on highlight-parenthesesel. +* Note on mmm-mode.el background colors: Note on mmm-modeel background colors. +* Note for prism:: +* Note on company-mode overlay pop-up:: +* Note on ERC escaped color sequences:: +* Note on powerline or spaceline:: +* Note on SHR colors:: +* Note on SHR fonts:: +* Note on Ement colors and fonts:: +* Note on pdf-tools link hints:: +* Note on the Notmuch logo:: +* Note on goto-address-mode faces:: + +Frequently Asked Questions + +* Is the contrast ratio about adjacent colors?:: +* What does it mean to avoid exaggerations?:: +* Why are colors mostly variants of blue, magenta, cyan?: Why are colors mostly variants of blue magenta cyan?. +* What is the best setup for legibility?:: +* Are these color schemes?:: +* Port the Modus themes to other platforms?:: + +Contributing + +* Sources of the themes:: +* Issues you can help with:: +* Patches require copyright assignment to the FSF:: + +Indices + +* Function index:: +* Variable index:: +* Concept index:: + + + +File: docGYh7V6.info, Node: Overview, Next: Installation, Prev: Top, Up: Top + +1 Overview +********** + +The Modus themes are designed for accessible readability. They conform +with the highest standard for color contrast between combinations of +background and foreground values. For small sized text, this +corresponds to the WCAG AAA standard, which specifies a minimum rate of +distance in relative luminance of 7:1. + + The Modus themes consist of eight themes, divided into four +subgroups. + +Main themes + ‘modus-operandi’ is the project’s main light theme, while + ‘modus-vivendi’ is its dark counterpart. These two themes are part + of the project since its inception. They are designed to cover a + broad range of needs and are, in the opinion of the author, the + reference for what a highly legible “default” theme should look + like. + +Tinted themes + ‘modus-operandi-tinted’ and ‘modus-vivendi-tinted’ are variants of + the two main themes. They slightly tone down the intensity of the + background and provide a bit more color variety. + ‘modus-operandi-tinted’ has a set of base tones that are shades of + light ochre (earthly colors), while ‘modus-vivendi-tinted’ gives a + night sky impression. + +Deuteranopia themes + ‘modus-operandi-deuteranopia’ and its companion + ‘modus-vivendi-deuteranopia’ are optimized for users with red-green + color deficiency. This means that they do not use red and green + hues for color-coding purposes, such as for diff removed and added + lines. Instead, they implement colors that are discernible by + users with deueteranopia or deuteranomaly (mostly yellow and blue + hues). + +Tritanopia themes + ‘modus-operandi-tritanopia’ and its counterpart + ‘modus-vivendi-tritanopia’ are optimized for users with blue-yellow + color deficiency. The idea is the same as with the deuteranopia + variants: color coding relies only on hues that are accessible to + people with tritanopia or tritanomaly, namely, shades of red and + cyan. + + To ensure that users have a consistently accessible experience, the +themes strive to achieve as close to full face coverage as possible, +while still targeting a curated list of well-maintained packages (*note +Face coverage::). + + The overarching objective of this project is to always offer +accessible color combinations. There shall never be a compromise on +this principle. If there arises an inescapable trade-off between +usability and stylistic considerations, we will always opt for the +former. + + Starting with version 0.12.0 and onwards, the themes are built into +GNU Emacs. + +* Menu: + +* How do the themes look like:: +* Learn about the latest changes:: + + +File: docGYh7V6.info, Node: How do the themes look like, Next: Learn about the latest changes, Up: Overview + +1.1 How do the themes look like +=============================== + +Check the web page with the screen shots +(https://protesilaos.com/emacs/modus-themes-pictures/). Note that the +themes are highly customizable (*note Customization options::). + + +File: docGYh7V6.info, Node: Learn about the latest changes, Prev: How do the themes look like, Up: Overview + +1.2 Learn about the latest changes +================================== + +Please refer to the web page with the change log +(https://protesilaos.com/emacs/modus-themes-changelog). It is +comprehensive and covers everything that goes into every tagged release +of the themes. + + +File: docGYh7V6.info, Node: Installation, Next: Enable and load, Prev: Overview, Up: Top + +2 Installation +************** + +The Modus themes are distributed with Emacs starting with version 28.1. +On older versions of Emacs, they can be installed using Emacs’ package +manager or manually from their code repository. There also exist +packages for distributions of GNU/Linux. + + Emacs 28 ships with ‘modus-themes’ version ‘1.6.0’. Emacs 29 +includes version ‘3.0.0’. Emacs 30 provides a newer, refactored version +that thoroughly refashions how the themes are implemented and +customized. Such major versions are not backward-compatible due to the +limited resources at the maintainer’s disposal to support multiple +versions of Emacs and of the themes across the years. + +* Menu: + +* Install manually from source:: +* Install from the archives:: +* Install on GNU/Linux:: +* Dealing with byte compilation errors:: + + +File: docGYh7V6.info, Node: Install manually from source, Next: Install from the archives, Up: Installation + +2.1 Install manually from source +================================ + +In the following example, we are assuming that your Emacs files are +stored in ‘~/.emacs.d’ and that you want to place the Modus themes in +‘~/.emacs.d/modus-themes’. + + 1. Get the source and store it in the desired path by running the + following in the command line shell: + + $ git clone https://gitlab.com/protesilaos/modus-themes.git ~/.emacs.d/modus-themes + + 1. Add that path to your known Elisp libraries’ list, by placing this + snippet of Emacs Lisp in your init file (e.g. ‘init.el’): + + (add-to-list 'load-path "~/.emacs.d/modus-themes") + + The themes are now ready to be used: *note Enable and load::. + + +File: docGYh7V6.info, Node: Install from the archives, Next: Install on GNU/Linux, Prev: Install manually from source, Up: Installation + +2.2 Install from the archives +============================= + +The ‘modus-themes’ package is available from the GNU ELPA archive, which +is configured by default. + + Prior to querying any package archive, make sure to update the index, +with ‘M-x package-refresh-contents’. Then all you need to do is type +‘M-x package-install’ and specify the ‘modus-themes’. + + Once installed, the themes are ready to be used: *note Enable and +load::. + + +File: docGYh7V6.info, Node: Install on GNU/Linux, Next: Dealing with byte compilation errors, Prev: Install from the archives, Up: Installation + +2.3 Install on GNU/Linux +======================== + +The themes are also available from the archives of some distributions of +GNU/Linux. These should correspond to a tagged release rather than +building directly from the latest Git commit. It all depends on the +distro’s packaging policies. + +* Menu: + +* Debian 11 Bullseye:: +* GNU Guix:: + + +File: docGYh7V6.info, Node: Debian 11 Bullseye, Next: GNU Guix, Up: Install on GNU/Linux + +2.3.1 Debian 11 Bullseye +------------------------ + +The themes are part of Debian 11 Bullseye. Get them with: + + sudo apt install elpa-modus-themes + + They are now ready to be used: *note Enable and load::. + + NOTE that Debian’s package is severely out-of-date as of this writing +2022-07-24 09:57 +0300. + + +File: docGYh7V6.info, Node: GNU Guix, Prev: Debian 11 Bullseye, Up: Install on GNU/Linux + +2.3.2 GNU Guix +-------------- + +Users of Guix can get the themes with this command: + + guix package -i emacs-modus-themes + + They are now ready to be used: *note Enable and load::. + + +File: docGYh7V6.info, Node: Dealing with byte compilation errors, Prev: Install on GNU/Linux, Up: Installation + +2.4 Dealing with byte compilation errors +======================================== + +From time to time, we receive bug reports pertaining to errors with byte +compilation. These seldom have to do with faulty code in the themes: it +might be a shortcoming of ‘package.el’, some regression in the current +development target of Emacs, a misconfiguration in an otherwise exotic +setup, and the like. + + The common solution with a stable version of Emacs is to: + + 1. Delete the ‘modus-themes’ package. + 2. Close the current Emacs session. + 3. Install the ‘modus-themes’ again. + + For those building Emacs directly from source, the solution may +involve reverting to an earlier commit in emacs.git. + + At any rate, if you encounter such an issue please report it: we will +either fix the bug on our end if it is truly ours, or help forward it to +the relevant upstream maintainer. Whatever you do, please understand +that a build failure does not mean we are necessarily doing something +wrong. + + *note Issues you can help with::. + + +File: docGYh7V6.info, Node: Enable and load, Next: Customization options, Prev: Installation, Up: Top + +3 Enable and load +***************** + +NOTE that Emacs can load multiple themes, which typically produces +undesirable results and undoes the work of the designer. Use the +‘disable-theme’ command if you are trying other themes beside the Modus +collection (*note Option for disabling other themes while loading Modus: +Disable other themes.). + + Users of the built-in themes cannot ‘require’ the package as usual +because there is no package to speak of. Instead, things are simpler as +built-in themes are considered safe. All one needs is to load the theme +of their preference by adding either form to their init file: + + (load-theme 'modus-operandi) ; Light theme + (load-theme 'modus-vivendi) ; Dark theme + + Remember that the Modus themes are six themes (*note Overview::). +Adapt the above snippet accordingly. + + Users of packaged variants of the themes must add a few more lines to +ensure that everything works as intended. First, one has to require the +main library before loading one of the themes: + + (require 'modus-themes) + + One can activate a theme with something like the following +expression, replacing ‘modus-operandi’ with their preferred Modus theme: + + (load-theme 'modus-operandi :no-confirm) + + Changes to the available customization options must always be +evaluated before loading a theme (*note Customization Options: +Customization options.). Reload a theme for new changes to take effect. + + This is how a basic setup could look like (*note The require-theme +for built-in Emacs themes: The require-theme for built-in Emacs +themes.): + + ;;; For the built-in themes which cannot use `require'. + (require-theme 'modus-themes) + + ;; Add all your customizations prior to loading the themes. + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Load the theme of your choice. + (load-theme 'modus-operandi) + + ;; Optionally define a key to switch between Modus themes. Also check + ;; the user option `modus-themes-to-toggle'. + (define-key global-map (kbd "<f5>") #'modus-themes-toggle) + + + + ;;; For packaged versions which must use `require'. + + (require 'modus-themes) + + ;; Add all your customizations prior to loading the themes + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Load the theme of your choice. + (load-theme 'modus-operandi :no-confirm) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle) + + *note Sample configuration with and without use-package::. + +* Menu: + +* The require-theme for built-in Emacs themes:: +* Sample configuration with and without use-package:: +* Differences between loading and enabling:: + + +File: docGYh7V6.info, Node: The require-theme for built-in Emacs themes, Next: Sample configuration with and without use-package, Up: Enable and load + +3.1 The ‘require-theme’ for built-in Emacs themes +================================================= + +The version of the Modus themes that is included in Emacs CANNOT use the +standard ‘require’. This is because the built-in themes are not +included in the ‘load-path’ (not my decision). The ‘require-theme’ +function must be used in this case as a replacement. For example: + + (require-theme 'modus-themes) + + ;; All customizations here + (setq modus-themes-bold-constructs t + modus-themes-italic-constructs t) + + ;; Maybe define some palette overrides, such as by using our presets + (setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + + ;; Load the theme of choice (built-in themes are always "safe" so they + ;; do not need the `no-require' argument of `load-theme'). + (load-theme 'modus-operandi) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle) + + +File: docGYh7V6.info, Node: Sample configuration with and without use-package, Next: Differences between loading and enabling, Prev: The require-theme for built-in Emacs themes, Up: Enable and load + +3.2 Sample configuration with and without use-package +===================================================== + +What follows is a variant of what we demonstrate in the previous section +(*note Enable and load::). + + It is common for Emacs users to rely on ‘use-package’ for declaring +package configurations in their setup. We use this as an example: + + ;;; For the built-in themes which cannot use `require'. + (use-package emacs + :config + (require-theme 'modus-themes) ; `require-theme' is ONLY for the built-in Modus themes + + ;; Add all your customizations prior to loading the themes + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Maybe define some palette overrides, such as by using our presets + (setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + + ;; Load the theme of your choice. + (load-theme 'modus-operandi) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle)) + + + + ;;; For packaged versions which must use `require'. + (use-package modus-themes + :ensure t + :config + ;; Add all your customizations prior to loading the themes + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Maybe define some palette overrides, such as by using our presets + (setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + + ;; Load the theme of your choice. + (load-theme 'modus-operandi) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle)) + + The same without ‘use-package’: + + (require 'modus-themes) ; OR for the built-in themes: (require-theme 'modus-themes) + + ;; Add all your customizations prior to loading the themes + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil) + + ;; Maybe define some palette overrides, such as by using our presets + (setq modus-themes-common-palette-overrides + modus-themes-preset-overrides-intense) + + ;; Load the theme of your choice: + (load-theme 'modus-operandi :no-confirm) + + (define-key global-map (kbd "<f5>") #'modus-themes-toggle) + + *note Differences between loading and enabling::. + + Note: make sure not to customize the variable +‘custom-theme-load-path’ or ‘custom-theme-directory’ after the themes’ +package declaration. That will lead to failures in loading the files. +If either or both of those variables need to be changed, their values +should be defined before the package declaration of the themes. + + *note Make the themes look like what the maintainer uses:: + + +File: docGYh7V6.info, Node: Differences between loading and enabling, Prev: Sample configuration with and without use-package, Up: Enable and load + +3.3 Differences between loading and enabling +============================================ + +The reason we recommend ‘load-theme’ instead of the other option of +‘enable-theme’ is that the former does a kind of “reset” on the face +specs. It quite literally loads (or reloads) the theme. Whereas the +‘enable-theme’ function simply puts an already loaded theme to the top +of the list of enabled items, re-using whatever state was last loaded. + + As such, ‘load-theme’ reads all customizations that may happen during +any given Emacs session: even after the initial setup of a theme. +Examples are calls to ‘custom-set-faces’, as well as new values assigned +to the options the Modus themes provide (*note Customization Options: +Customization options.). + + Our tests show that ‘enable-theme’ does not read such variables anew, +so it might appear to the unsuspecting user that the themes are somehow +broken whenever they try to assign a new value to a customization option +or some face. + + This “reset” that ‘load-theme’ brings about does, however, come at +the cost of being somewhat slower than ‘enable-theme’. Users who have a +stable setup and who seldom update their variables during a given Emacs +session, are better off using something like this: + + (require 'modus-themes) + + ;; Activate your desired themes here + (load-theme 'modus-operandi t t) + (load-theme 'modus-vivendi t t) + + ;; Enable the preferred one + (enable-theme 'modus-operandi) + + *note Toggle themes without reloading them::. + + *note Sample configuration with and without use-package::. + + With the above granted, other sections of the manual discuss how to +configure custom faces, where ‘load-theme’ is expected, though +‘enable-theme’ could still apply in stable setups: + + *note Use theme colors in code with modus-themes-with-colors::. + + +File: docGYh7V6.info, Node: Customization options, Next: Advanced customization, Prev: Enable and load, Up: Top + +4 Customization options +*********************** + +The Modus themes are highly configurable, though they should work well +without any further tweaks. We provide a variety of user options. The +following code block provides an overview. In addition to those +variables, the themes support a comprehensive system of overrides: it +can be used to make thoroughgoing changes to the looks of the themes +(*note Option for palette overrides: Palette overrides.). We document +everything at length in the pages of this manual and also provide +ready-to-use code samples. + + Remember that all customization options must be evaluated before +loading a theme (*note Enable and load::). If the theme is already +active, it must be reloaded for changes to take effect. + + ;; In all of the following, WEIGHT is a symbol such as `semibold', + ;; `light', `bold', or anything mentioned in `modus-themes-weights'. + (setq modus-themes-italic-constructs t + modus-themes-bold-constructs nil + modus-themes-mixed-fonts t + modus-themes-variable-pitch-ui nil + modus-themes-custom-auto-reload t + modus-themes-disable-other-themes t + + ;; Options for `modus-themes-prompts' are either nil (the + ;; default), or a list of properties that may include any of those + ;; symbols: `italic', `WEIGHT' + modus-themes-prompts '(italic bold) + + ;; The `modus-themes-completions' is an alist that reads two + ;; keys: `matches', `selection'. Each accepts a nil value (or + ;; empty list) or a list of properties that can include any of + ;; the following (for WEIGHT read further below): + ;; + ;; `matches' :: `underline', `italic', `WEIGHT' + ;; `selection' :: `underline', `italic', `WEIGHT' + modus-themes-completions + '((matches . (extrabold)) + (selection . (semibold italic text-also))) + + modus-themes-org-blocks 'gray-background ; {nil,'gray-background,'tinted-background} + + ;; The `modus-themes-headings' is an alist: read the manual's + ;; node about it or its doc string. Basically, it supports + ;; per-level configurations for the optional use of + ;; `variable-pitch' typography, a height value as a multiple of + ;; the base font size (e.g. 1.5), and a `WEIGHT'. + modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (1.3)) + (agenda-date . (1.3)) + (agenda-structure . (variable-pitch light 1.8)) + (t . (1.1)))) + + ;; Remember that more (MUCH MORE) can be done with overrides, which we + ;; document extensively in this manual. + +* Menu: + +* Custom reload theme:: Toggle auto-reload of the theme when setting custom variables +* Disable other themes:: Determine whether loading a Modus themes disables all others +* Bold constructs:: Toggle bold constructs in code +* Italic constructs:: Toggle italic font constructs in code +* Mixed fonts:: Toggle mixing of font families +* Command prompts:: Control the style of command prompts +* Completion UIs:: Choose among several styles for completion UIs +* Org mode blocks:: Choose among plain, gray, or tinted backgrounds +* Heading styles:: Choose among several styles, also per heading level +* UI typeface:: Toggle the use of variable-pitch across the User Interface +* Palette overrides:: Refashion color values and/or semantic color mappings + + +File: docGYh7V6.info, Node: Custom reload theme, Next: Disable other themes, Up: Customization options + +4.1 Option for reloading the theme on custom change +=================================================== + +Brief: Toggle reloading of the active theme when an option is changed +through the Custom UI. + + Symbol: ‘modus-themes-custom-auto-reload’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ + 2. ‘t’ (default) + + All theme user options take effect when a theme is loaded. Any +subsequent changes require the theme to be reloaded. + + When this variable has a non-‘nil’ value, any change made via the +Custom UI or related functions such as ‘customize-set-variable’ and +‘setopt’ (Emacs 29), will trigger a reload automatically. + + With a ‘nil’ value, changes to user options have no further +consequences: the user must manually reload the theme (*note Enable and +load::). + + +File: docGYh7V6.info, Node: Disable other themes, Next: Bold constructs, Prev: Custom reload theme, Up: Customization options + +4.2 Option for disabling other themes while loading Modus +========================================================= + +Brief: Disable all other themes when loading a Modus theme. + + Symbol: ‘modus-themes-disable-other-themes’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ + 2. ‘t’ (default) + + When the value is non-‘nil’, the commands ‘modus-themes-toggle’ and +‘modus-themes-select’, as well as the ‘modus-themes-load-theme’ +function, will disable all other themes while loading the specified +Modus theme. This is done to ensure that Emacs does not blend two or +more themes: such blends lead to awkward results that undermine the work +of the designer. + + When the value is ‘nil’, the aforementioned commands and function +will only disable other themes within the Modus collection. + + This option is provided because Emacs themes are not necessarily +limited to colors/faces: they can consist of an arbitrary set of +customizations. Users who use such customization bundles must set this +variable to a ‘nil’ value. + + +File: docGYh7V6.info, Node: Bold constructs, Next: Italic constructs, Prev: Disable other themes, Up: Customization options + +4.3 Option for more bold constructs +=================================== + +Brief: Use bold for code syntax highlighting and related. + + Symbol: ‘modus-themes-bold-constructs’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ (default) + 2. ‘t’ + + The default is to use a bold typographic weight only when it is +required. + + With a non-‘nil’ value (‘t’) display several syntactic constructs in +bold weight. This concerns keywords and other important aspects of code +syntax. It also affects certain mode line indicators and command +prompts. + + Advanced users may also want to configure the exact attributes of the +‘bold’ face. + + *note Configure bold and italic faces::. + + +File: docGYh7V6.info, Node: Italic constructs, Next: Mixed fonts, Prev: Bold constructs, Up: Customization options + +4.4 Option for more italic constructs +===================================== + +Brief: Use italics for code syntax highlighting and related. + + Symbol: ‘modus-themes-italic-constructs’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ (default) + 2. ‘t’ + + The default is to not use slanted text forms (italics) unless it is +absolutely necessary. + + With a non-‘nil’ value (‘t’) choose to render more faces in italics. +This typically affects documentation strings and code comments. + + Advanced users may also want to configure the exact attributes of the +‘italic’ face. + + *note Configure bold and italic faces::. + + +File: docGYh7V6.info, Node: Mixed fonts, Next: Command prompts, Prev: Italic constructs, Up: Customization options + +4.5 Option for font mixing +========================== + +Brief: Toggle the use of monospaced fonts for spacing-sensitive +constructs (affects font families). + + Symbol: ‘modus-themes-mixed-fonts’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ (default) + 2. ‘t’ + + When set to non-‘nil’ (‘t’), configure some spacing-sensitive faces +like Org tables and code blocks to always inherit from the ‘fixed-pitch’ +face. This is to ensure that certain constructs like code blocks and +tables remain monospaced even when users opt for a mode that remaps +typeface families, such as the built-in ‘M-x variable-pitch-mode’. +Otherwise the layout can appear broken, due to how spacing is done. + + For a consistent experience, user may need to specify the font family +of the ‘fixed-pitch’ face. + + *note Font configurations for Org and others::. + + +File: docGYh7V6.info, Node: Command prompts, Next: Completion UIs, Prev: Mixed fonts, Up: Customization options + +4.6 Option for command prompt styles +==================================== + +Brief: Control the style of command prompts (e.g. minibuffer, shell, +IRC clients). + + Symbol: ‘modus-themes-prompts’ (‘choice’ type, list of properties) + + Possible values are expressed as a list of properties (default is +‘nil’ or an empty list). The list can include any of the following +symbols: + + • ‘italic’ + • ‘italic’ + • A font weight, which must be supported by the underlying typeface: + • ‘thin’ + • ‘ultralight’ + • ‘extralight’ + • ‘light’ + • ‘semilight’ + • ‘regular’ + • ‘medium’ + • ‘semibold’ + • ‘bold’ + • ‘heavy’ + • ‘extrabold’ + • ‘ultrabold’ + + The default (a ‘nil’ value or an empty list) means to only use a +subtle colored foreground color. + + The ‘italic’ property adds a slant to the font’s forms (italic or +oblique forms, depending on the typeface). + + The symbol of a font weight attribute such as ‘light’, ‘semibold’, et +cetera, adds the given weight to links. Valid symbols are defined in +the variable ‘modus-themes-weights’. The absence of a weight means that +the one of the underlying text will be used. + + Combinations of any of those properties are expressed as a list, like +in these examples: + + (bold italic) + (italic semibold) + + The order in which the properties are set is not significant. + + In user configuration files the form may look like this: + + (setq modus-themes-prompts '(extrabold italic)) + + *note Make prompts more or less colorful::. + + +File: docGYh7V6.info, Node: Completion UIs, Next: Org mode blocks, Prev: Command prompts, Up: Customization options + +4.7 Option for completion framework aesthetics +============================================== + +Brief: Set the overall style of completion framework interfaces. + + Symbol: ‘modus-themes-completions’ (‘alist’ type properties) + + This affects Company, Corfu, Flx, Icomplete/Fido, Ido, Ivy, +Orderless, Vertico, and the standard ‘*Completions*’ buffer. The value +is an alist of expressions, each of which takes the form of ‘(KEY . +LIST-OF-PROPERTIES)’. ‘KEY’ is a symbol, while ‘PROPERTIES’ is a list. +Here is a sample, followed by a description of the particularities: + + (setq modus-themes-completions + '((matches . (extrabold underline)) + (selection . (semibold italic)))) + + The ‘matches’ key refers to the highlighted characters that +correspond to the user’s input. When its properties are ‘nil’ or an +empty list, matching characters in the user interface will have a bold +weight and a colored foreground. The list of properties may include any +of the following symbols regardless of the order they may appear in: + + • ‘underline’ to draw a line below the characters; + + • ‘italic’ to use a slanted font (italic or oblique forms); + + • The symbol of a font weight attribute such as ‘light’, ‘semibold’, + et cetera. Valid symbols are defined in the variable + ‘modus-themes-weights’. The absence of a weight means that bold + will be used. + + The ‘selection’ key applies to the current line or currently matched +candidate, depending on the specifics of the user interface. When its +properties are ‘nil’ or an empty list, it has a subtle gray background, +a bold weight, and the base foreground value for the text. The list of +properties it accepts is as follows (order is not significant): + + • ‘underline’ to draw a line below the characters; + + • ‘italic’ to use a slanted font (italic or oblique forms); + + • The symbol of a font weight attribute such as ‘light’, ‘semibold’, + et cetera. Valid symbols are defined in the variable + ‘modus-themes-weights’. The absence of a weight means that bold + will be used. + + Apart from specifying each key separately, a catch-all list is +accepted. This is only useful when the desired aesthetic is the same +across all keys that are not explicitly referenced. For example, this: + + (setq modus-themes-completions + '((t . (extrabold underline)))) + + Is the same as: + + (setq modus-themes-completions + '((matches . (extrabold underline)) + (selection . (extrabold underline)))) + + *note Make completion matches more or less colorful::. + + +File: docGYh7V6.info, Node: Org mode blocks, Next: Heading styles, Prev: Completion UIs, Up: Customization options + +4.8 Option for org-mode block styles +==================================== + +Brief: Set the overall style of Org code blocks, quotes, and the like. + + Symbol: ‘modus-themes-org-blocks’ (‘choice’ type) + + Possible values: + + 1. ‘nil’ (default) + 2. ‘gray-background’ + 3. ‘tinted-background’ + + Option ‘nil’ (the default) means that the block has no background of +its own: it uses the one that applies to the rest of the buffer. In +this case, the delimiter lines have a gray color for their text, making +them look exactly like all other Org properties. + + Option ‘gray-background’ applies a subtle gray background to the +block’s contents. It also affects the begin and end lines of the block +as they get another shade of gray as their background, which +differentiates them from the contents of the block. All background +colors extend to the edge of the window, giving the area a rectangular, +“blocky” presentation. If the begin/end lines do not extend in this +way, check the value of the Org user option +‘org-fontify-whole-block-delimiter-line’. + + Option ‘tinted-background’ uses a colored background for the contents +of the block. The exact color value will depend on the programming +language and is controlled by the variable ‘org-src-block-faces’ (refer +to the theme’s source code for the current association list). For this +to take effect, the Org buffer needs to be restarted with +‘org-mode-restart’. + + Code blocks use their major mode’s fontification (syntax +highlighting) only when the variable ‘org-src-fontify-natively’ is +non-‘nil’. While quote/verse blocks require setting +‘org-fontify-quote-and-verse-blocks’ to a non-‘nil’ value. + + *note Update Org block delimiter fontification::. + + +File: docGYh7V6.info, Node: Heading styles, Next: UI typeface, Prev: Org mode blocks, Up: Customization options + +4.9 Option for the headings’ overall style +========================================== + +Brief: Heading styles with optional list of values per heading level. + + Symbol: ‘modus-themes-headings’ (‘alist’ type, multiple properties) + + This is an alist that accepts a ‘(KEY . LIST-OF-VALUES)’ combination. +The ‘KEY’ is either a number, representing the heading’s level (0 +through 8) or ‘t’, which pertains to the fallback style. The named keys +‘agenda-date’ and ‘agenda-structure’ apply to the Org agenda. + + Level 0 is a special heading: it is used for what counts as a +document title or equivalent, such as the ‘#+title’ construct we find in +Org files. Levels 1-8 are regular headings. + + The ‘LIST-OF-VALUES’ covers symbols that refer to properties, as +described below. Here is a complete sample with various stylistic +combinations, followed by a presentation of all available properties: + + (setq modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (1.3)) + (agenda-date . (1.3)) + (agenda-structure . (variable-pitch light 1.8)) + (t . (1.1)))) + + Properties: + + • A font weight, which must be supported by the underlying typeface: + • ‘thin’ + • ‘ultralight’ + • ‘extralight’ + • ‘light’ + • ‘semilight’ + • ‘regular’ + • ‘medium’ + • ‘semibold’ + • ‘bold’ (default) + • ‘heavy’ + • ‘extrabold’ + • ‘ultrabold’ + • A floating point as a height multiple of the default or a cons cell + in the form of ‘(height . FLOAT)’. + + By default (a ‘nil’ value for this variable), all headings have a +bold typographic weight and use a desaturated text color. + + A ‘variable-pitch’ property changes the font family of the heading to +that of the ‘variable-pitch’ face (normally a proportionately spaced +typeface). + + The symbol of a weight attribute adjusts the font of the heading +accordingly, such as ‘light’, ‘semibold’, etc. Valid symbols are +defined in the variable ‘modus-themes-weights’. The absence of a weight +means that bold will be used by virtue of inheriting the ‘bold’ face. + + *note Configure bold and italic faces::. + + A number, expressed as a floating point (e.g. 1.5), adjusts the +height of the heading to that many times the base font size. The +default height is the same as 1.0, though it need not be explicitly +stated. Instead of a floating point, an acceptable value can be in the +form of a cons cell like ‘(height . FLOAT)’ or ‘(height FLOAT)’, where +FLOAT is the given number. + + Combinations of any of those properties are expressed as a list, like +in these examples: + + (semibold) + (variable-pitch semibold 1.3) + (variable-pitch semibold (height 1.3)) ; same as above + (variable-pitch semibold (height . 1.3)) ; same as above + + The order in which the properties are set is not significant. + + In user configuration files the form may look like this: + + (setq modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (1.3)) + (agenda-date . (1.3)) + (agenda-structure . (variable-pitch light 1.8)) + (t . (1.1)))) + + When defining the styles per heading level, it is possible to pass a +non-‘nil’ value (‘t’) instead of a list of properties. This will retain +the original aesthetic for that level. For example: + + (setq modus-themes-headings + '((1 . t) ; keep the default style + (2 . (semibold 1.2)) + (t . (rainbow)))) ; style for all other headings + + (setq modus-themes-headings + '((1 . (variable-pitch 1.5)) + (2 . (semibold)) + (t . t))) ; default style for all other levels + + Note that the text color of headings, of their background, and +overline can all be set via the overrides. It is possible to have any +color combination for any heading level (something that could not be +done in older versions of the themes). + + *note Option for palette overrides: Palette overrides. + + *note Make headings more or less colorful::. + + +File: docGYh7V6.info, Node: UI typeface, Next: Palette overrides, Prev: Heading styles, Up: Customization options + +4.10 Option for variable-pitch font in UI elements +================================================== + +Brief: Toggle the use of proportionately spaced (‘variable-pitch’) fonts +in the User Interface. + + Symbol: ‘modus-themes-variable-pitch-ui’ (‘boolean’ type) + + Possible values: + + 1. ‘nil’ (default) + 2. ‘t’ + + This option concerns User Interface elements that are under the +direct control of Emacs. In particular: the mode line, header line, tab +bar, and tab line. + + The default is to use the same font as the rest of Emacs, which +usually is a monospaced family. + + With a non-‘nil’ value (‘t’) apply a proportionately spaced typeface. +This is done by assigning the ‘variable-pitch’ face to the relevant +items. + + *note Font configurations for Org and others::. + + +File: docGYh7V6.info, Node: Palette overrides, Prev: UI typeface, Up: Customization options + +4.11 Option for palette overrides +================================= + +This section describes palette overrides in detail. For a simpler +alternative, use the presets we provide (*note Palette override +presets::). + + Each Modus theme specifies a color palette that declares named color +values and semantic color mappings: + + • Named colors consist of a symbol and a string that specifies a + hexadecimal RGB value. For example: ‘(blue-warmer "#354fcf")’. + + • The semantic color mappings associate an abstract construct with a + given named color from the palette, like ‘(heading-2 + yellow-faint)’. Both elements of the list are symbols, though the + ‘cadr’ (value) can be a string that specifies a color, such as + ‘(heading-2 "#354fcf")’. + + Both of those subsets can be overridden, thus refashioning the theme. +Overrides are either shared, by being stored in the user option +‘modus-themes-common-palette-overrides’, or they are specific to the +theme they name. In the latter case, the naming scheme of each palette +variable is ‘THEME-NAME-palette-overrides’, thus yielding: + + • ‘modus-operandi-palette-overrides’ + + • ‘modus-operandi-deuteranopia-palette-overrides’ + + • ‘modus-operandi-tinted-palette-overrides’ + + • ‘modus-operandi-tritanopia-palette-overrides’ + + • ‘modus-vivendi-palette-overrides’ + + • ‘modus-vivendi-deuteranopia-palette-overrides’ + + • ‘modus-vivendi-tinted-palette-overrides’ + + • ‘modus-vivendi-tritanopia-palette-overrides’ + + Theme-specific overrides take precedence over the shared ones. It is +strongly advised that shared overrides do NOT alter color values, as +those will not be appropriate for both dark and light themes. Common +overrides are best limited to the semantic color mappings as those use +the color value that corresponds to the active theme (e.g. make the +cursor ‘blue-warmer’ in all themes, whatever the value of ‘blue-warmer’ +is in each theme). + + The value of any overrides’ variable must mirror a theme’s palette. +Palette variables are named after their theme as ‘THEME-NAME-palette’. +For example, the ‘modus-operandi-palette’ is like this: + + (defconst modus-operandi-palette + '( + ;;; Basic values + + (bg-main "#ffffff") + (bg-dim "#f0f0f0") + (fg-main "#000000") + + ;; ... + + (red "#a60000") + (red-warmer "#972500") + (red-cooler "#a0132f") + (red-faint "#7f0000") + (red-intense "#d00000") + + ;; ... + + ;;;; Mappings + + ;; ... + + (cursor fg-main) + (builtin magenta-warmer) + (comment fg-dim) + (constant blue-cooler) + (docstring green-faint) + (fnname magenta) + (keyword magenta-cooler) + + ;; ... + )) + + The ‘modus-operandi-palette-overrides’ targets the entries that need +to be changed. For example, to make the main foreground color a dark +gray instead of pure black, use a shade of red for comments, and apply a +cyan hue to keywords: + + (setq modus-operandi-palette-overrides + '((fg-main "#333333") + (comment red-faint) + (keyword cyan-cooler))) + + Changes take effect upon theme reload (*note Custom reload theme::). +Overrides are removed by setting their variable to a ‘nil’ value. + + The common accented foregrounds in each palette follow a predictable +naming scheme: ‘HUE{,-warmer,-cooler,-faint,-intense}’. ‘HUE’ is one of +the six basic colors: red, green, blue, yellow, magenta, cyan. + + Named colors that are meant to be used as backgrounds contain ‘bg’ in +their name, such as ‘bg-red-intense’. While special purpose foregrounds +that are meant to be combined with such backgrounds, contain ‘fg’ in +their name, such as ‘fg-removed’ which complements ‘bg-removed’. + + Named colors can be previewed, such as with the command +‘modus-themes-list-colors’ (*note Preview theme colors::). + + For a video tutorial that users of all skill levels can approach, +watch: +<https://protesilaos.com/codelog/2022-12-17-modus-themes-v4-demo/>. + + +File: docGYh7V6.info, Node: Advanced customization, Next: Face coverage, Prev: Customization options, Up: Top + +5 Advanced customization +************************ + +Unlike the predefined customization options which follow a clear pattern +of allowing the user to quickly specify their preference, the themes +also provide a more flexible, albeit difficult, mechanism to control +things with precision (*note Customization Options: Customization +options.). + + This section is of interest only to users who are prepared to +maintain their own local tweaks and who are willing to deal with any +possible incompatibilities between versioned releases of the themes. As +such, they are labeled as “do-it-yourself” or “DIY”. + +* Menu: + +* Palette override presets:: +* Stylistic variants using palette overrides:: +* More accurate colors in terminal emulators:: +* Range of color with terminal emulators:: +* Preview theme colors:: +* Per-theme customization settings:: +* Get a single color from the palette:: +* Use theme colors in code with modus-themes-with-colors:: +* Do not extend the region background:: +* Add padding to mode line:: +* Remap face with local value:: +* Font configurations for Org and others:: +* Configure bold and italic faces:: +* Custom Org todo keyword and priority faces:: +* Custom Org emphasis faces:: +* Update Org block delimiter fontification:: +* Measure color contrast:: +* Load theme depending on time of day:: +* Backdrop for pdf-tools:: +* Toggle themes without reloading them:: +* A theme-agnostic hook for theme loading:: +* Use more spacious margins or padding in Emacs frames:: +* Custom hl-todo colors:: +* Add support for solaire-mode:: + + +File: docGYh7V6.info, Node: Palette override presets, Next: Stylistic variants using palette overrides, Up: Advanced customization + +5.1 Palette override presets +============================ + +This section shows how to refashion the themes by opting in to the +stylistic presets we provide. Those presets override the default color +mappings to amplify, tone down, or refashion the overall coloration of +the themes. + + To make almost all aspects of the themes less intense, use this: + + ;; Always remember to reload the theme for changes to take effect! + (setq modus-themes-common-palette-overrides modus-themes-preset-overrides-faint) + + With ‘modus-themes-preset-overrides-faint’ the grays are toned down, +gray backgrounds are removed from some contexts, and almost all accent +colors are desaturated. It makes the themes less attention-grabbing. + + On the opposite end of the stylistic spectrum, we have this + + ;; Always remember to reload the theme for changes to take effect! + (setq modus-themes-common-palette-overrides modus-themes-preset-overrides-intense) + + The ‘modus-themes-preset-overrides-intense’ makes many background +colors accented instead of gray and increases coloration in a number of +places. Colors stand out more and are made easier to spot. + + For some stylistic variation try the “cooler” and “warmer” presets: + + ;; This: + (setq modus-themes-common-palette-overrides modus-themes-preset-overrides-cooler) + + ;; Or: + (setq modus-themes-common-palette-overrides modus-themes-preset-overrides-warmer) + + Note that the user is not limited to those presets. The system of +overrides we provide makes it possible to tweak the value of each +individual named color and to change how values are assigned to semantic +color mappings (*note Option for palette overrides: Palette overrides.). +Subsequent sections provide examples (*note Stylistic variants using +palette overrides::). + + It is also possible to use those presets as a basis and, for example, +add to them code from the subsequent sections of this manual. This is +the general idea (extra space for didactic purposes): + + (setq modus-themes-common-palette-overrides + `( + ;; From the section "Make the mode line borderless" + (border-mode-line-active unspecified) + (border-mode-line-inactive unspecified) + + ;; From the section "Make matching parenthesis more or less intense" + (bg-paren-match bg-magenta-intense) + (underline-paren-match fg-main) + + ;; And expand the preset here. Note that the ,@ works because + ;; we use the backtick for this list, instead of a straight + ;; quote. + ,@modus-themes-preset-overrides-intense)) + + +File: docGYh7V6.info, Node: Stylistic variants using palette overrides, Next: More accurate colors in terminal emulators, Prev: Palette override presets, Up: Advanced customization + +5.2 Stylistic variants using palette overrides +============================================== + +This section contains practical examples of overriding the palette of +the themes (*note Option for palette overrides: Palette overrides.). +Users can copy the code to their init file, evaluate it, and then +re-load the theme for changes to take effect. To apply overrides at +startup simply define them before the call that loads the theme. +Remember that we also provide presets that are easier to apply (*note +Palette override presets::). + +* Menu: + +* Make the mode line borderless:: +* Make the active mode line colorful:: +* Make the tab bar more or less colorful:: +* Make the fringe invisible or another color:: +* Make links use subtle or no underlines:: +* Make prompts more or less colorful:: +* Make completion matches more or less colorful:: +* Make comments yellow and strings green:: +* Make code syntax use the old alt-syntax style:: +* Make use of alternative styles for code syntax:: +* Make matching parenthesis more or less intense:: +* Make box buttons more or less gray:: +* Make TODO and DONE more or less intense:: +* Make headings more or less colorful:: +* Make Org agenda more or less colorful:: +* Make inline code in prose use alternative styles:: +* Make mail citations and headers more or less colorful:: +* Make the region preserve text colors, plus other styles: Make the region preserve text colors plus other styles. +* Make mouse highlights more or less colorful:: +* Make language underlines less colorful:: +* Make line numbers use alternative styles:: +* Make diffs use only a foreground:: +* Make deuteranopia diffs red and blue instead of yellow and blue:: +* Make the themes look like what the maintainer uses:: + + +File: docGYh7V6.info, Node: Make the mode line borderless, Next: Make the active mode line colorful, Up: Stylistic variants using palette overrides + +5.2.1 Make the mode line borderless +----------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +To hide the border around the active and inactive mode lines, we need to +set their color to that of the underlying background. + + *note Make the active mode line colorful::. + + *note Add padding to mode line::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Remove the border + (setq modus-themes-common-palette-overrides + '((border-mode-line-active unspecified) + (border-mode-line-inactive unspecified))) + + ;; Keep the border but make it the same color as the background of the + ;; mode line (thus appearing borderless). The difference with the + ;; above is that this version is a bit thicker because the border are + ;; still there. + (setq modus-themes-common-palette-overrides + '((border-mode-line-active bg-mode-line-active) + (border-mode-line-inactive bg-mode-line-inactive))) + + +File: docGYh7V6.info, Node: Make the active mode line colorful, Next: Make the tab bar more or less colorful, Prev: Make the mode line borderless, Up: Stylistic variants using palette overrides + +5.2.2 Make the active mode line colorful +---------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show some snippets that apply different stylistic variants. Of +course, it is possible to use theme-specific overrides to, say, have a +blue mode line for ‘modus-operandi’ and a red one for ‘modus-vivendi’. + + *note Make the mode line borderless::. + + *note Add padding to mode line::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Blue background, neutral foreground, intense blue border + (setq modus-themes-common-palette-overrides + '((bg-mode-line-active bg-blue-intense) + (fg-mode-line-active fg-main) + (border-mode-line-active blue-intense))) + + ;; Subtle blue background, neutral foreground, intense blue border + (setq modus-themes-common-palette-overrides + '((bg-mode-line-active bg-blue-subtle) + (fg-mode-line-active fg-main) + (border-mode-line-active blue-intense))) + + ;; Subtle red background, red foreground, invisible border + (setq modus-themes-common-palette-overrides + '((bg-mode-line-active bg-red-subtle) + (fg-mode-line-active red-warmer) + (border-mode-line-active bg-red-subtle))) + + +File: docGYh7V6.info, Node: Make the tab bar more or less colorful, Next: Make the fringe invisible or another color, Prev: Make the active mode line colorful, Up: Stylistic variants using palette overrides + +5.2.3 Make the tab bar more or less colorful +-------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to affect the colors of the built-in ‘tab-bar-mode’ and +‘tab-line-mode’. + + For consistent theme-wide results, consider changing the mode line, +fringes, and line numbers. These are shown in other sections of this +manual. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Make the `tab-bar-mode' mode subtle while keepings its original + ;; gray aesthetic. + (setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-main) + (bg-tab-current bg-active) + (bg-tab-other bg-dim))) + + ;; Like the above, but the current tab has a colorful background and + ;; the inactive tabs have a slightly more noticeable gray background. + (setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-main) + (bg-tab-current bg-cyan-intense) + (bg-tab-other bg-inactive))) + + ;; Make the tabs colorful, using a monochromatic pattern (e.g. shades + ;; of cyan). + (setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-cyan-nuanced) + (bg-tab-current bg-cyan-intense) + (bg-tab-other bg-cyan-subtle))) + + ;; Like the above, but with a dichromatic pattern (cyan and magenta). + (setq modus-themes-common-palette-overrides + '((bg-tab-bar bg-cyan-nuanced) + (bg-tab-current bg-magenta-intense) + (bg-tab-other bg-cyan-subtle))) + + +File: docGYh7V6.info, Node: Make the fringe invisible or another color, Next: Make links use subtle or no underlines, Prev: Make the tab bar more or less colorful, Up: Stylistic variants using palette overrides + +5.2.4 Make the fringe invisible or another color +------------------------------------------------ + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to make the fringe invisible or how to assign to it a +different color. The “fringe” is a small area to the right and left +side of the Emacs window which shows indicators such as for truncation +or continuation lines. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Make the fringe invisible + (setq modus-themes-common-palette-overrides + '((fringe unspecified))) + + ;; Make the fringe more intense + (setq modus-themes-common-palette-overrides + '((fringe bg-active))) + + ;; Make the fringe colorful, but nuanced + (setq modus-themes-common-palette-overrides + '((fringe bg-blue-nuanced))) + + +File: docGYh7V6.info, Node: Make links use subtle or no underlines, Next: Make prompts more or less colorful, Prev: Make the fringe invisible or another color, Up: Stylistic variants using palette overrides + +5.2.5 Make links use subtle or no underlines +-------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this example, we showcase the special use of the ‘unspecified’ symbol +that underline mappings can read correctly. + + ;; Subtle underlines + (setq modus-themes-common-palette-overrides + '((underline-link border) + (underline-link-visited border) + (underline-link-symbolic border))) + + ;; No underlines + (setq modus-themes-common-palette-overrides + '((underline-link unspecified) + (underline-link-visited unspecified) + (underline-link-symbolic unspecified))) + + +File: docGYh7V6.info, Node: Make prompts more or less colorful, Next: Make completion matches more or less colorful, Prev: Make links use subtle or no underlines, Up: Stylistic variants using palette overrides + +5.2.6 Make prompts more or less colorful +---------------------------------------- + +This section contains practical examples of overriding the palette of +the themes (*note Option for palette overrides: Palette overrides.). In +the following code block we show how to add or remove color from +prompts. + + *note Option for command prompt styles: Command prompts. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Keep the background unspecified (like the default), but use a faint + ;; foreground color. + (setq modus-themes-common-palette-overrides + '((fg-prompt cyan-faint) + (bg-prompt unspecified))) + + ;; Add a nuanced background to prompts that complements their foreground. + (setq modus-themes-common-palette-overrides + '((fg-prompt cyan) + (bg-prompt bg-cyan-nuanced))) + + ;; Add a yellow background and adjust the foreground accordingly. + (setq modus-themes-common-palette-overrides + '((fg-prompt fg-main) + (bg-prompt bg-yellow-subtle))) ; try to replace "subtle" with "intense" + + +File: docGYh7V6.info, Node: Make completion matches more or less colorful, Next: Make comments yellow and strings green, Prev: Make prompts more or less colorful, Up: Stylistic variants using palette overrides + +5.2.7 Make completion matches more or less colorful +--------------------------------------------------- + +This section contains practical examples of overriding the palette of +the themes (*note Option for palette overrides: Palette overrides.). +Here we demonstrate how to activate background coloration for completion +matches. We show three different degrees of intensity. + + *note Option for completion framework aesthetics: Completion UIs. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Add a nuanced background color to completion matches, while keeping + ;; their foreground intact (foregrounds do not need to be specified in + ;; this case, but we do it for didactic purposes). + (setq modus-themes-common-palette-overrides + '((fg-completion-match-0 blue) + (fg-completion-match-1 magenta-warmer) + (fg-completion-match-2 cyan) + (fg-completion-match-3 red) + (bg-completion-match-0 bg-blue-nuanced) + (bg-completion-match-1 bg-magenta-nuanced) + (bg-completion-match-2 bg-cyan-nuanced) + (bg-completion-match-3 bg-red-nuanced))) + + ;; Add intense background colors to completion matches and adjust the + ;; foregrounds accordingly. + (setq modus-themes-common-palette-overrides + '((fg-completion-match-0 fg-main) + (fg-completion-match-1 fg-main) + (fg-completion-match-2 fg-main) + (fg-completion-match-3 fg-main) + (bg-completion-match-0 bg-blue-intense) + (bg-completion-match-1 bg-yellow-intense) + (bg-completion-match-2 bg-cyan-intense) + (bg-completion-match-3 bg-red-intense))) + + ;; Like the above, but with subtle backgrounds. + (setq modus-themes-common-palette-overrides + '((fg-completion-match-0 fg-main) + (fg-completion-match-1 fg-main) + (fg-completion-match-2 fg-main) + (fg-completion-match-3 fg-main) + (bg-completion-match-0 bg-blue-subtle) + (bg-completion-match-1 bg-yellow-subtle) + (bg-completion-match-2 bg-cyan-subtle) + (bg-completion-match-3 bg-red-subtle))) + + Adding to the above, it is possible to, say, reduce the number of +colors to two: + + ;; No backgrounds (like the default) and just use two colors. + (setq modus-themes-common-palette-overrides + '((fg-completion-match-0 blue) + (fg-completion-match-1 yellow) + (fg-completion-match-2 blue) + (fg-completion-match-3 yellow) + (bg-completion-match-0 unspecified) + (bg-completion-match-1 unspecified) + (bg-completion-match-2 unspecified) + (bg-completion-match-3 unspecified))) + + ;; Again, a two-color style but this time with backgrounds + (setq modus-themes-common-palette-overrides + '((fg-completion-match-0 blue) + (fg-completion-match-1 yellow) + (fg-completion-match-2 blue) + (fg-completion-match-3 yellow) + (bg-completion-match-0 bg-blue-nuanced) + (bg-completion-match-1 bg-yellow-nuanced) + (bg-completion-match-2 bg-blue-nuanced) + (bg-completion-match-3 bg-yellow-nuanced))) + + The user can mix and match to their liking. + + +File: docGYh7V6.info, Node: Make comments yellow and strings green, Next: Make code syntax use the old alt-syntax style, Prev: Make completion matches more or less colorful, Up: Stylistic variants using palette overrides + +5.2.8 Make comments yellow and strings green +-------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In previous versions of the themes, we provided an option for yellow-ish +comments and green-ish strings. For some users, those were still not +good enough, as the exact values were hardcoded. Here we show how to +reproduce the effect, but also how to tweak it to one’s liking. + + *note Make code syntax use the old alt-syntax style::. + + *note Make use of alternative styles for code syntax::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Yellow comments and green strings like older versions of the Modus + ;; themes + (setq modus-themes-common-palette-overrides + '((comment yellow-cooler) + (string green-cooler))) + + ;; Faint yellow comments and a different shade of green for strings + (setq modus-themes-common-palette-overrides + '((comment yellow-faint) + (string green-warmer))) + + ;; Green comments and yellow strings, because now the user has the + ;; freedom to do it + (setq modus-themes-common-palette-overrides + '((comment green) + (string yellow-cooler))) + + +File: docGYh7V6.info, Node: Make code syntax use the old alt-syntax style, Next: Make use of alternative styles for code syntax, Prev: Make comments yellow and strings green, Up: Stylistic variants using palette overrides + +5.2.9 Make code syntax use the old alt-syntax style +--------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this section we show how to reproduce what previous versions of the +Modus themes provided as a stylistic alternative for code syntax. The +upside of using overrides for this purpose is that we can tweak the +style to our liking, but first let’s start with its recreation: + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; The old "alt-syntax" + (setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment fg-dim) + (constant magenta-cooler) + (docstring magenta-faint) + (docmarkup green-faint) + (fnname magenta-warmer) + (keyword cyan) + (preprocessor cyan-cooler) + (string red-cooler) + (type magenta-cooler) + (variable blue-warmer) + (rx-construct magenta-warmer) + (rx-backslash blue-cooler))) + + The “alt-syntax” could optionally use green strings and yellow +comments (*note Make comments yellow and strings green::): + + ;; Same as above, but with yellow comments and green strings + (setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment yellow-faint) + (constant magenta-cooler) + (docstring green-faint) + (docmarkup magenta-faint) + (fnname magenta-warmer) + (keyword cyan) + (preprocessor cyan-cooler) + (string green-cooler) + (type magenta-cooler) + (variable blue-warmer) + (rx-construct magenta-warmer) + (rx-backslash blue-cooler))) + + The standard “alt-syntax” has red strings. As such, it is +interesting to experiment with faintly red colored comments: + + ;; Like the old "alt-syntax" but with faint red comments + (setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment red-faint) + (constant magenta-cooler) + (docstring magenta-faint) + (docmarkup green-faint) + (fnname magenta-warmer) + (keyword cyan) + (preprocessor cyan-cooler) + (string red-cooler) + (type magenta-cooler) + (variable blue-warmer) + (rx-construct magenta-warmer) + (rx-backslash blue-cooler))) + + The user can always mix and match styles to their liking. + + *note Make use of alternative styles for code syntax::. + + +File: docGYh7V6.info, Node: Make use of alternative styles for code syntax, Next: Make matching parenthesis more or less intense, Prev: Make code syntax use the old alt-syntax style, Up: Stylistic variants using palette overrides + +5.2.10 Make use of alternative styles for code syntax +----------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +The idea here is to change how named colors are mapped to code syntax. +Each of the following snippets give the ‘modus-themes’ a different feel +while editing code. + + Note that my ‘modus-themes’ and ‘ef-themes’ do not use the same +palettes, so some things are different. If you copy from the latter to +the former, double-check that the entries exist in the given Modus theme +palette. + + *note Make comments yellow and strings green::. + + *note Make code syntax use the old alt-syntax style::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Mimic `ef-night' theme (from my `ef-themes') for code syntax + ;; highlighting, while still using the Modus colors (and other + ;; mappings). + (setq modus-themes-common-palette-overrides + '((builtin green-cooler) + (comment yellow-faint) + (constant magenta-cooler) + (fnname cyan-cooler) + (keyword blue-warmer) + (preprocessor red-warmer) + (docstring cyan-faint) + (string blue-cooler) + (type magenta-cooler) + (variable cyan))) + + ;; Mimic `ef-summer' theme (from my `ef-themes') for code syntax + ;; highlighting, while still using the Modus colors (and other + ;; mappings). + (setq modus-themes-common-palette-overrides + '((builtin magenta) + (comment yellow-faint) + (constant red-cooler) + (fnname magenta-warmer) + (keyword magenta-cooler) + (preprocessor green-warmer) + (docstring cyan-faint) + (string yellow-warmer) + (type cyan-warmer) + (variable blue-warmer))) + + ;; Mimic `ef-bio' theme (from my `ef-themes') for code syntax + ;; highlighting, while still using the Modus colors (and other + ;; mappings). + (setq modus-themes-common-palette-overrides + '((builtin green) + (comment yellow-faint) + (constant blue) + (fnname green-warmer) + (keyword green-cooler) + (preprocessor green) + (docstring green-faint) + (string magenta-cooler) + (type cyan-warmer) + (variable blue-warmer))) + + ;; Mimic `ef-trio-light' theme (from my `ef-themes') for code syntax + ;; highlighting, while still using the Modus colors (and other + ;; mappings). + (setq modus-themes-common-palette-overrides + '((builtin magenta-cooler) + (comment yellow-faint) + (constant magenta-warmer) + (fnname blue-warmer) + (keyword magenta) + (preprocessor red-cooler) + (docstring magenta-faint) + (string green-cooler) + (type cyan-cooler) + (variable cyan-warmer))) + + +File: docGYh7V6.info, Node: Make matching parenthesis more or less intense, Next: Make box buttons more or less gray, Prev: Make use of alternative styles for code syntax, Up: Stylistic variants using palette overrides + +5.2.11 Make matching parenthesis more or less intense +----------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this code block we show how to change the background of matching +delimiters when ‘show-paren-mode’ is enabled. We also demonstrate how +to enable underlines for those highlights. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Change the background to a shade of magenta + (setq modus-themes-common-palette-overrides + '((bg-paren-match bg-magenta-intense))) + + ;; Enable underlines by applying a color to them + (setq modus-themes-common-palette-overrides + '((bg-paren-match bg-magenta-intense) + (underline-paren-match fg-main))) + + +File: docGYh7V6.info, Node: Make box buttons more or less gray, Next: Make TODO and DONE more or less intense, Prev: Make matching parenthesis more or less intense, Up: Stylistic variants using palette overrides + +5.2.12 Make box buttons more or less gray +----------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +By default, the boxed buttons that appear in ‘M-x customize’ and related +are distinct shades of gray. The following set of overrides removes the +gray from the active buttons and amplifies it for the inactive ones. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + (setq modus-themes-common-palette-overrides + '((bg-button-active bg-main) + (fg-button-active fg-main) + (bg-button-inactive bg-inactive) + (fg-button-inactive "gray50"))) + + +File: docGYh7V6.info, Node: Make TODO and DONE more or less intense, Next: Make headings more or less colorful, Prev: Make box buttons more or less gray, Up: Stylistic variants using palette overrides + +5.2.13 Make TODO and DONE more or less intense +---------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to affect just the ‘TODO’ and ‘DONE’ keywords that we +encounter in Org buffers. The idea is to make those pop out more or to +subdue them. + + *note Make headings more or less colorful::. + + *note Make inline code in prose use alternative styles::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Increase intensity + (setq modus-themes-common-palette-overrides + '((prose-done green-intense) + (prose-todo red-intense))) + + ;; Tone down intensity + (setq modus-themes-common-palette-overrides + '((prose-done green-faint) ; OR replace `green-faint' with `olive' + (prose-todo red-faint))) ; OR replace `red-faint' with `rust' + + ;; Keep TODO at its default (so no override for it), but make DONE + ;; gray. + (setq modus-themes-common-palette-overrides + '((prose-done fg-dim))) + + +File: docGYh7V6.info, Node: Make headings more or less colorful, Next: Make Org agenda more or less colorful, Prev: Make TODO and DONE more or less intense, Up: Stylistic variants using palette overrides + +5.2.14 Make headings more or less colorful +------------------------------------------ + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to alter the looks of headings, such as in Org mode. +Using overrides here offers far more flexibility than what we could +achieve with previous versions of the themes: the user can mix and match +styles at will. + + *note Make TODO and DONE more intense: Make TODO and DONE more or +less intense. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Apply more colorful foreground to some headings (headings 0-8). + ;; Level 0 is for Org #+title and related. + (setq modus-themes-common-palette-overrides + '((fg-heading-1 blue-warmer) + (fg-heading-2 yellow-cooler) + (fg-heading-3 cyan-cooler))) + + ;; Like the above, but with gradient colors + (setq modus-themes-common-palette-overrides + '((fg-heading-1 blue) + (fg-heading-2 cyan) + (fg-heading-3 green))) + + ;; Add color to level 1 heading, but use the main foreground for + ;; others + (setq modus-themes-common-palette-overrides + '((fg-heading-1 blue) + (fg-heading-2 fg-main) + (fg-heading-3 fg-main))) + + ;; Apply colorful foreground, background, and overline (headings 0-8) + (setq modus-themes-common-palette-overrides + '((fg-heading-1 blue-warmer) + (bg-heading-1 bg-blue-nuanced) + (overline-heading-1 blue))) + + ;; Apply gray scale foreground, background, and overline (headings 0-8) + (setq modus-themes-common-palette-overrides + '((fg-heading-1 fg-main) + (bg-heading-1 bg-dim) + (overline-heading-1 border))) + + +File: docGYh7V6.info, Node: Make Org agenda more or less colorful, Next: Make inline code in prose use alternative styles, Prev: Make headings more or less colorful, Up: Stylistic variants using palette overrides + +5.2.15 Make Org agenda more or less colorful +-------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we provide three distinct code blocks. The first adds alternative +and more varied colors to the Org agenda (and related). The second uses +faint coloration. The third makes the agenda use various shades of +blue. Mix and match at will, while also combining these styles with +what we show in the other chapters with practical stylistic variants. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + ;; Make the Org agenda use alternative and varied colors. + (setq modus-themes-common-palette-overrides + '((date-common cyan) ; default value (for timestamps and more) + (date-deadline red-warmer) + (date-event magenta-warmer) + (date-holiday blue) ; for M-x calendar + (date-now yellow-warmer) + (date-scheduled magenta-cooler) + (date-weekday cyan-cooler) + (date-weekend blue-faint))) + + An example with faint coloration: + + ;; Make the Org agenda use faint colors. + (setq modus-themes-common-palette-overrides + '((date-common cyan-faint) ; for timestamps and more + (date-deadline red-faint) + (date-event fg-alt) ; default + (date-holiday magenta) ; default (for M-x calendar) + (date-now fg-main) ; default + (date-scheduled yellow-faint) + (date-weekday fg-dim) + (date-weekend fg-dim))) + + A third example that makes the agenda more blue: + + ;; Make the Org agenda use more blue instead of yellow and red. + (setq modus-themes-common-palette-overrides + '((date-common cyan) ; default value (for timestamps and more) + (date-deadline blue-cooler) + (date-event blue-faint) + (date-holiday blue) ; for M-x calendar + (date-now blue-faint) + (date-scheduled blue) + (date-weekday fg-main) + (date-weekend fg-dim))) + + Yet another example that also affects ‘DONE’ and ‘TODO’ keywords: + + ;; Change dates to a set of more subtle combinations. Deadlines are a + ;; shade of magenta, scheduled dates are a shade of green that + ;; complements that of the deadlines, weekday headings use the main + ;; foreground color while weekends are a shade of gray. The DONE + ;; keyword is a faint blue-gray while TODO is yellow. + (setq modus-themes-common-palette-overrides + '((date-deadline magenta-warmer) + (date-scheduled green-cooler) + (date-weekday fg-main) + (date-event fg-dim) + (date-now blue) + (prose-done fg-alt) + (prose-todo yellow))) + + +File: docGYh7V6.info, Node: Make inline code in prose use alternative styles, Next: Make mail citations and headers more or less colorful, Prev: Make Org agenda more or less colorful, Up: Stylistic variants using palette overrides + +5.2.16 Make inline code in prose use alternative styles +------------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In the following code block we show how to affect constructs such as +Org’s verbatim, code, and macro entries. We also provide mappings for +tables, property drawers, tags, and code block delimiters, though we do +not show every possible permutation. + + *note Make TODO and DONE more or less intense::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; These are all the mappings at their default values for didactic + ;; purposes + (setq modus-themes-common-palette-overrides + '((prose-block fg-dim) + (prose-code green-cooler) + (prose-done green) + (prose-macro magenta-cooler) + (prose-metadata fg-dim) + (prose-metadata-value fg-alt) + (prose-table fg-alt) + (prose-tag magenta-faint) + (prose-todo red) + (prose-verbatim magenta-warmer))) + + ;; Make code block delimiters use a shade of red, tone down verbatim, + ;; code, and macro, and amplify the style of property drawers + (setq modus-themes-common-palette-overrides + '((prose-block red-faint) + (prose-code fg-dim) + (prose-macro magenta-faint) + (prose-metadata cyan) + (prose-metadata-value green-warmer) + (prose-verbatim fg-dim))) + + ;; Like the above but with more color variety for the inline code + ;; elements + (setq modus-themes-common-palette-overrides + '((prose-block red-faint) + (prose-code blue-cooler) + (prose-macro yellow-warmer) + (prose-metadata cyan) + (prose-metadata-value green-warmer) + (prose-verbatim red-warmer))) + + +File: docGYh7V6.info, Node: Make mail citations and headers more or less colorful, Next: Make the region preserve text colors plus other styles, Prev: Make inline code in prose use alternative styles, Up: Stylistic variants using palette overrides + +5.2.17 Make mail citations and headers more or less colorful +------------------------------------------------------------ + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this section we show how to change the coloration of email message +headers and citations. Before we show the code, this is the anatomy of +a message: + + From: Protesilaos <info@protesilaos.com> + To: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> + Subject: Test subject + --- Headers above this line; message and citations below --- + This is some sample text + + > > Older quote + > Newer quote + + We thus have the following: + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Reduce the intensity of mail citations and headers + (setq modus-themes-common-palette-overrides + '((mail-cite-0 cyan-faint) + (mail-cite-1 yellow-faint) + (mail-cite-2 green-faint) + (mail-cite-3 red-faint) + (mail-part olive) + (mail-recipient indigo) + (mail-subject maroon) + (mail-other slate))) + + ;; Make mail citations more intense; adjust the headers accordingly + (setq modus-themes-common-palette-overrides + '((mail-cite-0 blue) + (mail-cite-1 yellow) + (mail-cite-2 green) + (mail-cite-3 magenta) + (mail-part magenta-cooler) + (mail-recipient cyan) + (mail-subject red-warmer) + (mail-other cyan-cooler))) + + ;; Make all citations faint and neutral; make most headers green but + ;; use red for the subject lie so that it stands out + (setq modus-themes-common-palette-overrides + '((mail-cite-0 fg-dim) + (mail-cite-1 fg-alt) + (mail-cite-2 fg-dim) + (mail-cite-3 fg-alt) + (mail-part yellow-cooler) + (mail-recipient green-cooler) + (mail-subject red-cooler) + (mail-other green))) + + +File: docGYh7V6.info, Node: Make the region preserve text colors plus other styles, Next: Make mouse highlights more or less colorful, Prev: Make mail citations and headers more or less colorful, Up: Stylistic variants using palette overrides + +5.2.18 Make the region preserve text colors, plus other styles +-------------------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to make the region respect the underlying text colors +or how to make the background more/less intense while combining it with +an appropriate foreground value. + + *note Do not extend the region background::. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; A background with no specific foreground (use foreground of + ;; underlying text) + (setq modus-themes-common-palette-overrides + '((bg-region bg-ochre) ; try to replace `bg-ochre' with `bg-lavender', `bg-sage' + (fg-region unspecified))) + + ;; Subtle gray with a prominent blue foreground + (setq modus-themes-common-palette-overrides + '((bg-region bg-dim) + (fg-region blue-cooler))) + + ;; Intense magenta background combined with the main foreground + (setq modus-themes-common-palette-overrides + '((bg-region bg-magenta-intense) + (fg-region fg-main))) + + +File: docGYh7V6.info, Node: Make mouse highlights more or less colorful, Next: Make language underlines less colorful, Prev: Make the region preserve text colors plus other styles, Up: Stylistic variants using palette overrides + +5.2.19 Make mouse highlights more or less colorful +-------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In the following code block we show how to affect the semantic color +mapping that covers mouse hover effects and related highlights: + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Make the background an intense yellow + (setq modus-themes-common-palette-overrides + '((bg-hover bg-yellow-intense))) + + ;; Make the background subtle green + (setq modus-themes-common-palette-overrides + '((bg-hover bg-green-subtle))) + + +File: docGYh7V6.info, Node: Make language underlines less colorful, Next: Make line numbers use alternative styles, Prev: Make mouse highlights more or less colorful, Up: Stylistic variants using palette overrides + +5.2.20 Make language underlines less colorful +--------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +Here we show how to affect the color of the underlines that are used by +code linters and prose spell checkers. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Make the underlines less intense + (setq modus-themes-common-palette-overrides + '((underline-err red-faint) + (underline-warning yellow-faint) + (underline-note cyan-faint))) + + ;; Change the color-coding of the underlines + (setq modus-themes-common-palette-overrides + '((underline-err yellow-intense) + (underline-warning magenta-intense) + (underline-note green-intense))) + + +File: docGYh7V6.info, Node: Make line numbers use alternative styles, Next: Make diffs use only a foreground, Prev: Make language underlines less colorful, Up: Stylistic variants using palette overrides + +5.2.21 Make line numbers use alternative styles +----------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this section we show how to affect the ‘display-line-numbers-mode’. + + ;; These overrides are common to all Modus themes. We also provide + ;; theme-specific options, such as `modus-operandi-palette-overrides'. + ;; + ;; In general, the theme-specific overrides are better for overriding + ;; color values, such as redefining what `blue-faint' looks like. The + ;; common overrides are best used for changes to semantic color + ;; mappings, as we show below. + + + ;; Make line numbers less intense + (setq modus-themes-common-palette-overrides + '((fg-line-number-inactive "gray50") + (fg-line-number-active fg-main) + (bg-line-number-inactive unspecified) + (bg-line-number-active unspecified))) + + ;; Like the above, but use a shade of red for the current line number + (setq modus-themes-common-palette-overrides + '((fg-line-number-inactive "gray50") + (fg-line-number-active red-cooler) + (bg-line-number-inactive unspecified) + (bg-line-number-active unspecified))) + + ;; Make all numbers more intense, use a more pronounce gray + ;; background, and make the current line have a colored background + (setq modus-themes-common-palette-overrides + '((fg-line-number-inactive fg-main) + (fg-line-number-active fg-main) + (bg-line-number-inactive bg-inactive) + (bg-line-number-active bg-cyan-intense))) + + +File: docGYh7V6.info, Node: Make diffs use only a foreground, Next: Make deuteranopia diffs red and blue instead of yellow and blue, Prev: Make line numbers use alternative styles, Up: Stylistic variants using palette overrides + +5.2.22 Make diffs use only a foreground +--------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this section we show how to change diff buffers (e.g. in ‘magit’) to +only use color-coded text without any added background. What we +basically do is to disable the applicable backgrounds and then intensify +the foregrounds. Since the deuteranopia-optimized themes do not use the +red-green color coding, we make an extra set of adjustments for them by +overriding their palettes directly instead of just using the “common” +overrides. + + ;; Diffs with only foreground colors. Word-wise ("refined") diffs + ;; have a gray background to draw attention to themselves. + (setq modus-themes-common-palette-overrides + '((bg-added unspecified) + (bg-added-faint unspecified) + (bg-added-refine bg-inactive) + (fg-added green) + (fg-added-intense green-intense) + + (bg-changed unspecified) + (bg-changed-faint unspecified) + (bg-changed-refine bg-inactive) + (fg-changed yellow) + (fg-changed-intense yellow-intense) + + (bg-removed unspecified) + (bg-removed-faint unspecified) + (bg-removed-refine bg-inactive) + (fg-removed red) + (fg-removed-intense red-intense) + + (bg-diff-context unspecified))) + + ;; Because deuteranopia cannot use the typical red-yellow-green + ;; combination, we need to arrange for a yellow-purple-blue sequence. + ;; Notice that the above covers the "common" overrides, so we do not + ;; need to reproduce the whole list of them. + (setq modus-operandi-deuteranopia-palette-overrides + '((fg-added blue) + (fg-added-intense blue-intense) + + (fg-changed magenta-cooler) + (fg-changed-intense magenta-intense) + + (fg-removed yellow-warmer) + (fg-removed-intense yellow-intense))) + + (setq modus-vivendi-deuteranopia-palette-overrides + '((fg-added blue) + (fg-added-intense blue-intense) + + (fg-changed magenta-cooler) + (fg-changed-intense magenta-intense) + + (fg-removed yellow) + (fg-removed-intense yellow-intense))) + + +File: docGYh7V6.info, Node: Make deuteranopia diffs red and blue instead of yellow and blue, Next: Make the themes look like what the maintainer uses, Prev: Make diffs use only a foreground, Up: Stylistic variants using palette overrides + +5.2.23 Make deuteranopia diffs red and blue instead of yellow and blue +---------------------------------------------------------------------- + +This is one of our practical examples to override the semantic colors of +the Modus themes (*note Stylistic variants using palette overrides::). +In this section we show how to implement a red+blue color coding for +diffs in the themes ‘modus-operandi-deuteranopia’ and +‘modus-vivendi-deuteranopia’. As those themes are optimized for users +with red-green color deficiency, they do not use the typical red+green +color coding for diffs, defaulting instead to yellow+blue which are +discernible. Users with deuteranomaly or, generally, those who like a +different aesthetic, can use the following to make diffs use the +red+yellow+blue color coding for removed, changed, and added lines +respectively. This is achieved by overriding the “changed” and +“removed” entries to use the colors of regular ‘modus-operandi’ and +‘modus-vivendi’. + + (setq modus-operandi-deuteranopia-palette-overrides + '((bg-changed "#ffdfa9") + (bg-changed-faint "#ffefbf") + (bg-changed-refine "#fac090") + (bg-changed-fringe "#d7c20a") + (fg-changed "#553d00") + (fg-changed-intense "#655000") + + (bg-removed "#ffd8d5") + (bg-removed-faint "#ffe9e9") + (bg-removed-refine "#f3b5af") + (bg-removed-fringe "#d84a4f") + (fg-removed "#8f1313") + (fg-removed-intense "#aa2222"))) + + (setq modus-vivendi-deuteranopia-palette-overrides + '((bg-changed "#363300") + (bg-changed-faint "#2a1f00") + (bg-changed-refine "#4a4a00") + (bg-changed-fringe "#8a7a00") + (fg-changed "#efef80") + (fg-changed-intense "#c0b05f") + + (bg-removed "#4f1119") + (bg-removed-faint "#380a0f") + (bg-removed-refine "#781a1f") + (bg-removed-fringe "#b81a1f") + (fg-removed "#ffbfbf") + (fg-removed-intense "#ff9095"))) + + +File: docGYh7V6.info, Node: Make the themes look like what the maintainer uses, Prev: Make deuteranopia diffs red and blue instead of yellow and blue, Up: Stylistic variants using palette overrides + +5.2.24 Make the themes look like what the maintainer uses +--------------------------------------------------------- + +Based on what we have learnt from the previous sections of this manual, +here is what Protesilaos uses: + + ;; Always reload the theme for changes to take effect! + + (setq modus-themes-custom-auto-reload nil + modus-themes-to-toggle '(modus-operandi modus-vivendi) + modus-themes-mixed-fonts t + modus-themes-variable-pitch-ui nil + modus-themes-italic-constructs t + modus-themes-bold-constructs nil + modus-themes-org-blocks nil + modus-themes-completions '((t . (extrabold))) + modus-themes-prompts nil + modus-themes-headings + '((agenda-structure . (variable-pitch light 2.2)) + (agenda-date . (variable-pitch regular 1.3)) + (t . (regular 1.15)))) + + (setq modus-themes-common-palette-overrides + '((cursor magenta-cooler) + ;; Make the fringe invisible. + (fringe unspecified) + ;; Make line numbers less intense and add a shade of cyan + ;; for the current line number. + (fg-line-number-inactive "gray50") + (fg-line-number-active cyan-cooler) + (bg-line-number-inactive unspecified) + (bg-line-number-active unspecified) + ;; Make the current line of `hl-line-mode' a fine shade of + ;; gray (though also see my `lin' package). + (bg-hl-line bg-dim) + ;; Make the region have a cyan-green background with no + ;; specific foreground (use foreground of underlying text). + ;; "bg-sage" refers to Salvia officinalis, else the common + ;; sage. + (bg-region bg-sage) + (fg-region unspecified) + ;; Make matching parentheses a shade of magenta. It + ;; complements the region nicely. + (bg-paren-match bg-magenta-intense) + ;; Make email citations faint and neutral, reducing the + ;; default four colors to two; make mail headers cyan-blue. + (mail-cite-0 fg-dim) + (mail-cite-1 blue-faint) + (mail-cite-2 fg-dim) + (mail-cite-3 blue-faint) + (mail-part cyan-warmer) + (mail-recipient blue-warmer) + (mail-subject magenta-cooler) + (mail-other cyan-warmer) + ;; Change dates to a set of more subtle combinations. + (date-deadline magenta-cooler) + (date-scheduled magenta) + (date-weekday fg-main) + (date-event fg-dim) + (date-now blue-faint) + ;; Make tags (Org) less colorful and tables look the same as + ;; the default foreground. + (prose-done cyan-cooler) + (prose-tag fg-dim) + (prose-table fg-main) + ;; Make headings less colorful (though I never use deeply + ;; nested headings). + (fg-heading-2 blue-faint) + (fg-heading-3 magenta-faint) + (fg-heading-4 blue-faint) + (fg-heading-5 magenta-faint) + (fg-heading-6 blue-faint) + (fg-heading-7 magenta-faint) + (fg-heading-8 blue-faint) + ;; Make the active mode line a fine shade of lavender + ;; (purple) and tone down the gray of the inactive mode + ;; lines. + (bg-mode-line-active bg-lavender) + (border-mode-line-active bg-lavender) + + (bg-mode-line-inactive bg-dim) + (border-mode-line-inactive bg-inactive) + ;; Make the prompts a shade of magenta, to fit in nicely with + ;; the overall blue-cyan-purple style of the other overrides. + ;; Add a nuanced background as well. + (bg-prompt bg-magenta-nuanced) + (fg-prompt magenta-cooler) + ;; Tweak some more constructs for stylistic constistency. + (name blue-warmer) + (identifier magenta-faint) + (keybind magenta-cooler) + (accent-0 magenta-cooler) + (accent-1 cyan-cooler) + (accent-2 blue-warmer) + (accent-3 red-cooler))) + + ;; Make the active mode line have a pseudo 3D effect (this assumes + ;; you are using the default mode line and not an extra package). + (custom-set-faces + '(mode-line ((t :box (:style released-button))))) + + +File: docGYh7V6.info, Node: More accurate colors in terminal emulators, Next: Range of color with terminal emulators, Prev: Stylistic variants using palette overrides, Up: Advanced customization + +5.3 More accurate colors in terminal emulators +============================================== + +[ This is based on partial information. Please help verify and/or +expand these findings. ] + + The graphical version of Emacs can reproduce color values accurately. +Whereas things get more tricky when Emacs is used in a terminal +emulator, because the terminals’ own capabilities determine the number +of colors that may be displayed: the Modus themes don’t look as good in +that case. + + There is, however, a way to instruct supported terminal emulators to +use more accurate colors. In a shell prompt type ‘toe -a | grep direct’ +to get a list of relevant terminfo entries. There should be items such +as ‘xterm-direct’, ‘alacritty-direct’, ‘kitty-direct’. Once you find +the one that corresponds to your terminal, call Emacs with an +environment variable like ‘TERM=xterm-direct’. Example that can be +adapted to shell aliases: + + TERM=xterm-direct emacsclient -nw + + Another example that can be bound to a key: + + TERM=xterm-direct uxterm -e emacsclient -nw + + +File: docGYh7V6.info, Node: Range of color with terminal emulators, Next: Preview theme colors, Prev: More accurate colors in terminal emulators, Up: Advanced customization + +5.4 Range of color with terminal emulators +========================================== + +[ This is based on partial information. Please help verify and/or +expand these findings. ] + + When Emacs runs in a non-windowed session its color reproduction +capacity is framed or determined by the underlying terminal emulator +(*note More accurate colors in terminal emulators::). Emacs cannot +produce a color that lies outside the range of what the terminal’s color +palette renders possible. + + This is immediately noticeable when the terminal’s first 16 codes do +not include a pure black value for the ‘termcol0’ entry and a pure white +for ‘termcol15’. Emacs cannot set the correct background (white for +‘modus-operandi’; black for ‘modus-vivendi’) or foreground (inverse of +the background). It thus falls back to the closest approximation, which +seldom is appropriate for the purposes of the Modus themes. + + In such a case, the user is expected to update their terminal’s color +palette such as by adapting these resources (*note Preview theme +colors::): + + ! Theme: modus-operandi + ! Description: XTerm port of modus-operandi (Modus themes for GNU Emacs) + ! Author: Protesilaos Stavrou, <https://protesilaos.com> + xterm*background: #ffffff + xterm*foreground: #000000 + xterm*color0: #000000 + xterm*color1: #a60000 + xterm*color2: #005e00 + xterm*color3: #813e00 + xterm*color4: #0031a9 + xterm*color5: #721045 + xterm*color6: #00538b + xterm*color7: #bfbfbf + xterm*color8: #595959 + xterm*color9: #972500 + xterm*color10: #315b00 + xterm*color11: #70480f + xterm*color12: #2544bb + xterm*color13: #5317ac + xterm*color14: #005a5f + xterm*color15: #ffffff + + ! Theme: modus-vivendi + ! Description: XTerm port of modus-vivendi (Modus themes for GNU Emacs) + ! Author: Protesilaos Stavrou, <https://protesilaos.com> + xterm*background: #000000 + xterm*foreground: #ffffff + xterm*color0: #000000 + xterm*color1: #ff8059 + xterm*color2: #44bc44 + xterm*color3: #d0bc00 + xterm*color4: #2fafff + xterm*color5: #feacd0 + xterm*color6: #00d3d0 + xterm*color7: #bfbfbf + xterm*color8: #595959 + xterm*color9: #ef8b50 + xterm*color10: #70b900 + xterm*color11: #c0c530 + xterm*color12: #79a8ff + xterm*color13: #b6a0ff + xterm*color14: #6ae4b9 + xterm*color15: #ffffff + + +File: docGYh7V6.info, Node: Preview theme colors, Next: Per-theme customization settings, Prev: Range of color with terminal emulators, Up: Advanced customization + +5.5 Preview theme colors +======================== + +The command ‘modus-themes-list-colors’ uses minibuffer completion to +select an item from the Modus themes and then produces a buffer with +previews of its color palette entries. The buffer has a naming scheme +that reflects the given choice, like ‘modus-operandi-list-colors’ for +the ‘modus-operandi’ theme. + + The command ‘modus-themes-list-colors-current’ skips the minibuffer +selection process and just produces a preview for the current Modus +theme. + + When called with a prefix argument (‘C-u’ with the default key +bindings), these commands will show a preview of the palette’s semantic +color mappings instead of the named colors. In this context, “named +colors” are entries that associate a symbol to a string color value, +such as ‘(blue-warmer "#354fcf")’. Whereas “semantic color mappings” +associate a named color to a symbol, like ‘(string blue-warmer)’, thus +making the theme render all string constructs in the ‘blue-warmer’ color +value (*note Option for palette overrides: Palette overrides.). + + Aliases for those commands are ‘modus-themes-preview-colors’ and +‘modus-themes-preview-colors-current’. + + Each row shows a foreground and background coloration using the +underlying value it references. For example a line with ‘#a60000’ (a +shade of red) will show red text followed by a stripe with that same +color as a backdrop. + + The name of the buffer describes the given Modus theme and what the +contents are, such as ‘*modus-operandi-list-colors*’ for named colors +and ‘=*modus-operandi-list-mappings*’ for the semantic color mappings. + + +File: docGYh7V6.info, Node: Per-theme customization settings, Next: Get a single color from the palette, Prev: Preview theme colors, Up: Advanced customization + +5.6 Per-theme customization settings +==================================== + +If you prefer to maintain different customization options between the +two themes, it is best you write your own functions that first set those +options and then load the relevant theme. The following code does +exactly that by simply differentiating the two themes on the choice of +bold constructs in code syntax (enabled for one, disabled for the +other). + + (defun my-demo-modus-operandi () + (interactive) + (setq modus-themes-bold-constructs t) ; ENABLE bold + (modus-themes-load-theme 'modus-operandi)) + + (defun my-demo-modus-vivendi () + (interactive) + (setq modus-themes-bold-constructs nil) ; DISABLE bold + (modus-themes-load-theme 'modus-vivendi)) + + (defun my-demo-modus-themes-toggle () + (if (eq (car custom-enabled-themes) 'modus-operandi) + (my-demo-modus-vivendi) + (my-demo-modus-operandi))) + + Then assign ‘my-demo-modus-themes-toggle’ to a key instead of the +equivalent the themes provide. + + For a more elaborate design, it is better to inspect the source code +of ‘modus-themes-toggle’ and relevant functions. + + +File: docGYh7V6.info, Node: Get a single color from the palette, Next: Use theme colors in code with modus-themes-with-colors, Prev: Per-theme customization settings, Up: Advanced customization + +5.7 Get a single color from the palette +======================================= + +*note Use theme colors in code with modus-themes-with-colors::. + + The fuction ‘modus-themes-get-color-value’ can be called from Lisp to +return the value of a color from the active Modus theme palette. It +takea a ‘COLOR’ argument and an optional ‘OVERRIDES’. + + ‘COLOR’ is a symbol that represents a named color entry in the +palette. + + *note Preview theme colors::. + + If the value is the name of another color entry in the palette (so a +mapping), this function recurs until it finds the underlying color +value. + + With an optional ‘OVERRIDES’ argument as a non-‘nil’ value, it +accounts for palette overrides. Else it reads only the default palette. + + *note Option for palette overrides: Palette overrides. + + With optional ‘THEME’ as a symbol among ‘modus-themes-items’ (alias +‘modus-themes-collection’), use the palette of that item. Else use the +current Modus theme. + + If ‘COLOR’ is not present in the palette, this function returns the +‘unspecified’ symbol, which is safe when used as a face attribute’s +value. + + An example with ‘modus-operandi’ to show how this function behaves +with/without overrides and when recursive mappings are introduced. + + ;; Here we show the recursion of palette mappings. In general, it is + ;; better for the user to specify named colors to avoid possible + ;; confusion with their configuration, though those still work as + ;; expected. + (setq modus-themes-common-palette-overrides + '((cursor red) + (fg-mode-line-active cursor) + (border-mode-line-active fg-mode-line-active))) + + ;; Ignore the overrides and get the original value. + (modus-themes-get-color-value 'border-mode-line-active) + ;; => "#5a5a5a" + + ;; Read from the overrides and deal with any recursion to find the + ;; underlying value. + (modus-themes-get-color-value 'border-mode-line-active :overrides) + ;; => "#a60000" + + +File: docGYh7V6.info, Node: Use theme colors in code with modus-themes-with-colors, Next: Do not extend the region background, Prev: Get a single color from the palette, Up: Advanced customization + +5.8 Use theme colors in code with modus-themes-with-colors +========================================================== + +*note Get a single color from the palette::. + + Note that users most probably do not need the following. Just rely +on the comprehensive overrides we provide (*note Option for palette +overrides: Palette overrides.). + + Advanced users may want to apply colors from the palette of the +active Modus theme in their custom code. The ‘modus-themes-with-colors’ +macro supplies those to any form called inside of it. For example: + + (modus-themes-with-colors + (list blue-warmer magenta-cooler fg-added warning variable fg-heading-4)) + ;; => ("#354fcf" "#531ab6" "#005000" "#884900" "#005e8b" "#721045") + + The above return value is for ‘modus-operandi’ when that is the +active theme. Switching to another theme and evaluating this code anew +will give us the relevant results for that theme (remember that since +version 4, the Modus themes consist of six items (*note Overview::)). +The same with ‘modus-vivendi’ as the active theme: + + (modus-themes-with-colors + (list blue-warmer magenta-cooler fg-added warning variable fg-heading-4)) + ;; => ("#79a8ff" "#b6a0ff" "#a0e0a0" "#fec43f" "#00d3d0" "#feacd0") + + The ‘modus-themes-with-colors’ has access to the whole palette of the +active theme, meaning that it can instantiate both (i) named colors like +‘blue-warmer’ and (ii) semantic color mappings like ‘warning’. We +provide commands to inspect those (*note Preview theme colors::). + + Others sections in this manual show how to use the aforementioned +macro (*note Advanced customization::). + + Because the ‘modus-themes-with-colors’ will most likely be used to +customize faces, note that any function that calls it must be run at +startup after the theme loads. The same function must also be assigned +to the ‘modus-themes-after-load-theme-hook’ for its effects to persist +and be updated when switching between Modus themes (e.g. to update the +exact value of ‘blue-warmer’ when toggling between ‘modus-operandi’ to +‘modus-vivendi’. + + +File: docGYh7V6.info, Node: Do not extend the region background, Next: Add padding to mode line, Prev: Use theme colors in code with modus-themes-with-colors, Up: Advanced customization + +5.9 Do not extend the region background +======================================= + +By the default, the background of the ‘region’ face extends from the end +of the line to the edge of the window. To limit it to the end of the +line, we need to override the face’s ‘:extend’ attribute. Adding this +to the Emacs configuration file will suffice: + + ;; Do not extend `region' background past the end of the line. + (custom-set-faces + '(region ((t :extend nil)))) + + *note Make the region preserve text colors, plus other styles: Make +the region preserve text colors plus other styles. + + +File: docGYh7V6.info, Node: Add padding to mode line, Next: Remap face with local value, Prev: Do not extend the region background, Up: Advanced customization + +5.10 Add padding to mode line +============================= + +Emacs faces do not have a concept of “padding” for the space between the +text and its box boundaries. We can approximate the effect by adding a +‘:box’ attribute, making its border several pixels thick, and using the +mode line’s background color for it. This way the thick border will not +stand out and will appear as a continuation of the mode line. + + *note Use theme colors in code with modus-themes-with-colors::. + + (defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + ;; Add "padding" to the mode lines + `(mode-line ((,c :box (:line-width 10 :color ,bg-mode-line-active)))) + `(mode-line-inactive ((,c :box (:line-width 10 :color ,bg-mode-line-inactive))))))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) + + The above has the effect of removing the border around the mode +lines. In older versions of the themes, we provided the option for a +padded mode line which could also have borders around it. Those were +not real border, however, but an underline and an overline. Adjusting +the above: + + (defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + ;; Add "padding" to the mode lines + `(mode-line ((,c :underline ,border-mode-line-active + :overline ,border-mode-line-active + :box (:line-width 10 :color ,bg-mode-line-active)))) + `(mode-line-inactive ((,c :underline ,border-mode-line-inactive + :overline ,border-mode-line-inactive + :box (:line-width 10 :color ,bg-mode-line-inactive))))))) + + ;; ESSENTIAL to make the underline move to the bottom of the box: + (setq x-underline-at-descent-line t) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) + + The reason we no longer provide this option is because it depends on +a non-‘nil’ value for ‘x-underline-at-descent-line’. That variable +affects ALL underlines, including those of links. The effect is +intrusive and looks awkard in prose. + + As such, the Modus themes no longer provide that option but instead +offer this piece of documentation to make the user fully aware of the +state of affairs. + + +File: docGYh7V6.info, Node: Remap face with local value, Next: Font configurations for Org and others, Prev: Add padding to mode line, Up: Advanced customization + +5.11 Remap face with local value +================================ + +There are cases where we need to change the buffer-local attributes of a +face. This might be because we have our own minor mode that re-uses a +face for a particular purpose, such as a line selection tool that +activates ‘hl-line-mode’, but we wish to keep it distinct from other +buffers. This is where ‘face-remap-add-relative’ can be applied and may +be combined with ‘modus-themes-with-colors’ to deliver consistent +results. + + *note Use theme colors in code with modus-themes-with-colors::. + + In this example we will write a simple interactive function that +adjusts the background color of the ‘region’ face. This is the sample +code: + + (defvar my-rainbow-region-colors + (modus-themes-with-colors + `((red . ,bg-red-subtle) + (green . ,bg-green-subtle) + (yellow . ,bg-yellow-subtle) + (blue . ,bg-blue-subtle) + (magenta . ,bg-magenta-subtle) + (cyan . ,bg-cyan-subtle))) + "Sample list of color values for `my-rainbow-region'.") + + (defun my-rainbow-region (color) + "Remap buffer-local attribute of `region' using COLOR." + (interactive + (list + (completing-read "Pick a color: " my-rainbow-region-colors))) + (face-remap-add-relative + 'region + `( :background ,(alist-get (intern color) my-rainbow-region-colors) + :foreground ,(face-attribute 'default :foreground)))) + + When ‘my-rainbow-region’ is called interactively, it prompts for a +color to use. The list of candidates is drawn from the car of each +association in ‘my-rainbow-region-colors’ (so “red”, “green”, etc.). + + To extend this principle, we may write wrapper functions that pass a +color directly. Those can be useful in tandem with hooks. Consider +this example: + + (defun my-rainbow-region-magenta () + (my-rainbow-region 'magenta)) + + (add-hook 'diff-mode-hook #'my-rainbow-region-magenta) + + Whenever we enter a ‘diff-mode’ buffer, we now get a magenta-colored +region. + + Perhaps you may wish to generalize those findings in to a set of +functions that also accept an arbitrary face. We shall leave the +experimentation up to you. + + +File: docGYh7V6.info, Node: Font configurations for Org and others, Next: Configure bold and italic faces, Prev: Remap face with local value, Up: Advanced customization + +5.12 Font configurations for Org and others +=========================================== + +The themes are designed to optionally cope well with mixed font +configurations. This mostly concerns ‘org-mode’ and ‘markdown-mode’, +though expect to find it elsewhere like in ‘Info-mode’. + + *note Option for font mixing: Mixed fonts. + + In practice it means that the user can safely opt for a more +prose-friendly proportionately spaced typeface as their default, while +spacing-sensitive elements like tables and inline code always use a +monospaced font, by inheriting from the ‘fixed-pitch’ face. + + Users can try the built-in ‘M-x variable-pitch-mode’ to see the +effect in action. + + To make everything use your desired font families, you need to +configure the ‘variable-pitch’ (proportional spacing) and ‘fixed-pitch’ +(monospaced) faces respectively. It may also be convenient to set your +main typeface by configuring the ‘default’ face the same way. + + [ The ‘fontaine’ package on GNU ELPA (by Protesilaos) is designed to +handle this case. ] + + Put something like this in your initialization file (also consider +reading the doc string of ‘set-face-attribute’): + + ;; Main typeface + (set-face-attribute 'default nil :family "DejaVu Sans Mono" :height 110) + + ;; Proportionately spaced typeface + (set-face-attribute 'variable-pitch nil :family "DejaVu Serif" :height 1.0) + + ;; Monospaced typeface + (set-face-attribute 'fixed-pitch nil :family "DejaVu Sans Mono" :height 1.5) + + Or employ the ‘face-attribute’ function to read an existing value, +such as if you want to make ‘fixed-pitch’ use the font family of the +‘default’ face: + + (set-face-attribute 'fixed-pitch nil :family (face-attribute 'default :family)) + + The next section shows how to make those work in a more elaborate +setup that is robust to changes between the Modus themes. + + *note Configure bold and italic faces::. + + Note the differences in the ‘:height’ property. The ‘default’ face +must specify an absolute value, which is the point size × 10. So if you +want to use a font at point size ‘11’, you set the height to ‘110’.(1) +Whereas every other face must either not specify a height or have a +value that is relative to the default, represented as a floating point. +If you use an integer, then that means an absolute height. This is of +paramount importance: it ensures that all fonts can scale gracefully +when using something like the ‘text-scale-adjust’ command which only +operates on the base font size (i.e. the ‘default’ face’s absolute +height). + + *note Note for EWW and Elfeed fonts: Note on SHR fonts. + + ---------- Footnotes ---------- + + (1) ‘:height’ values do not need to be rounded to multiples of ten: +the likes of ‘115’ are perfectly valid—some typefaces will change to +account for those finer increments. + + +File: docGYh7V6.info, Node: Configure bold and italic faces, Next: Custom Org todo keyword and priority faces, Prev: Font configurations for Org and others, Up: Advanced customization + +5.13 Configure bold and italic faces +==================================== + +The Modus themes do not hardcode a ‘:weight’ or ‘:slant’ attribute in +the thousands of faces they cover. Instead, they configure the generic +faces called ‘bold’ and ‘italic’ to use the appropriate styles and then +instruct all relevant faces that require emphasis to inherit from them. + + This practically means that users can change the particularities of +what it means for a construct to be bold/italic, by tweaking the ‘bold’ +and ‘italic’ faces. Cases where that can be useful include: + + • The default typeface does not have a variant with slanted glyphs + (e.g. Fira Mono/Code as of this writing on 2021-07-07), so the + user wants to add another family for the italics, such as Hack. + + • The typeface of choice provides a multitude of weights and the user + prefers the light one by default. To prevent the bold weight from + being too heavy compared to the light one, they opt to make ‘bold’ + use a semibold weight. + + • The typeface distinguishes between oblique and italic forms by + providing different font variants (the former are just slanted + versions of the upright forms, while the latter have distinguishing + features as well). In this case, the user wants to specify the + font that applies to the ‘italic’ face. + + To achieve those effects, one must first be sure that the fonts they +use have support for those features. It then is a matter of following +the instructions for all typeface tweaks. + + *note Font configurations for Org and others::. + + In this example, we set the default font family to Fira Code, while +we choose to render italics in the Hack typeface (obviously you need to +pick fonts that work well together): + + (set-face-attribute 'default nil :family "Fira Code" :height 110) + (set-face-attribute 'italic nil :family "Hack") + + And here we play with different weights, using Source Code Pro: + + (set-face-attribute 'default nil :family "Source Code Pro" :height 110 :weight 'light) + (set-face-attribute 'bold nil :weight 'semibold) + + To reset the font family, one can use this: + + (set-face-attribute 'italic nil :family 'unspecified) + + To ensure that the effects persist after switching between the Modus +themes (such as with ‘M-x modus-themes-toggle’), the user needs to write +their configurations to a function and pass it to the +‘modus-themes-after-load-theme-hook’. This is necessary because themes +set the styles of faces upon activation, overriding prior values where +conflicts occur between the previous and the current states (otherwise +changing themes would not be possible). + + *note A theme-agnostic hook for theme loading::. + + This is a minimal setup to preserve font configurations across theme +load phases. For a more permanent setup, it is better to rely on the +‘custom-set-faces’ function: ‘set-face-attribute’ works just fine, +though it probably is better suited for quick previews or for smaller +scale operations (‘custom-set-faces’ follows the format used in the +source code of the themes, which can make it easier to redefine faces in +bulk). + + ;; our generic function + (defun my-modes-themes-bold-italic-faces () + (set-face-attribute 'default nil :family "Source Code Pro" :height 110) + (set-face-attribute 'bold nil :weight 'semibold)) + + ;; or use this if you configure a lot of face and attributes and + ;; especially if you plan to use `modus-themes-with-colors', as shown + ;; elsewhere in the manual + (defun my-modes-themes-bold-italic-faces () + (custom-set-faces + '(default ((t :family "Source Code Pro" :height 110))) + '(bold ((t :weight semibold))))) + + ;; and here is the hook + (add-hook 'modus-themes-after-load-theme-hook #'my-modes-themes-bold-italic-faces) + + *note Use theme colors in code with modus-themes-with-colors::. + + +File: docGYh7V6.info, Node: Custom Org todo keyword and priority faces, Next: Custom Org emphasis faces, Prev: Configure bold and italic faces, Up: Advanced customization + +5.14 Custom Org todo keyword and priority faces +=============================================== + +Users of ‘org-mode’ have the option to configure various keywords and +priority cookies to better match their workflow. User options are +‘org-todo-keyword-faces’ and ‘org-priority-faces’. + + As those are meant to be custom faces, it is futile to have the +themes guess what each user wants to use, which keywords to target, and +so on. Instead, we can provide guidelines on how to customize things to +one’s liking with the intent of retaining the overall aesthetic of the +themes. + + Please bear in mind that the end result of those is not controlled by +the active Modus theme but by how Org maps faces to its constructs. +Editing those while ‘org-mode’ is active requires re-initialization of +the mode with ‘M-x org-mode-restart’ for changes to take effect. + + Let us assume you wish to visually differentiate your keywords. You +have something like this: + + (setq org-todo-keywords + '((sequence "TODO(t)" "|" "DONE(D)" "CANCEL(C)") + (sequence "MEET(m)" "|" "MET(M)") + (sequence "STUDY(s)" "|" "STUDIED(S)") + (sequence "WRITE(w)" "|" "WROTE(W)"))) + + You could then use a variant of the following to inherit from a face +that uses the styles you want and also to preserve the attributes +applied by the ‘org-todo’ face (in case there is a difference between +the two): + + (setq org-todo-keyword-faces + '(("MEET" . (:inherit (bold org-todo))) + ("STUDY" . (:inherit (warning org-todo))) + ("WRITE" . (:inherit (shadow org-todo))))) + + This will refashion the keywords you specify, while letting the other +items in ‘org-todo-keywords’ use their original styles, which are +defined in the ‘org-todo’ and ‘org-done’ faces. + + If you want back the defaults, try specifying just the ‘org-todo’ +face: + + (setq org-todo-keyword-faces + '(("MEET" . org-todo) + ("STUDY" . org-todo) + ("WRITE" . org-todo))) + + Or set ‘org-todo-keyword-faces’ to ‘nil’. + + When you inherit from multiple faces, you need to do it the way it is +shown further above. The order is significant: the first entry is +applied on top of the second, overriding any attributes that are +explicitly set for both of them: any attribute that is not specified is +not overridden, so, for example, if ‘org-todo’ has a background and a +foreground, while ‘font-lock-type-face’ only has a foreground, the +merged face will include the background of the former and the foreground +of the latter. If you do not want to blend multiple faces, you only +specify one by name without parentheses or an ‘:inherit’ keyword. A +pattern of ‘keyword . face’ will suffice. + + Both approaches can be used simultaneously, as illustrated in this +configuration of the priority cookies: + + (setq org-priority-faces + '((?A . (:inherit (bold org-priority))) + (?B . org-priority) + (?C . (:inherit (shadow org-priority))))) + + To find all the faces that are loaded in your current Emacs session, +use ‘M-x list-faces-display’. Try ‘M-x describe-variable’ as well and +then specify the name of each of those Org variables demonstrated above. +Their documentation strings will offer you further guidance. + + Recall that the themes let you retrieve a color from their palette. +Do it if you plan to control face attributes. + + *note Check color combinations: Measure color contrast. + + +File: docGYh7V6.info, Node: Custom Org emphasis faces, Next: Update Org block delimiter fontification, Prev: Custom Org todo keyword and priority faces, Up: Advanced customization + +5.15 Custom Org emphasis faces +============================== + +Org provides the user option ‘org-emphasis-alist’ which associates a +character with a face, list of faces, or face attributes. The default +specification of that variable looks like this: + + (setq org-emphasis-alist + '(("*" bold) + ("/" italic) + ("_" underline) + ("=" org-verbatim verbatim) + ("~" org-code verbatim) + ("+" (:strike-through t)))) + + With the exception of ‘org-verbatim’ and ‘org-code’ faces, everything +else uses the corresponding type of emphasis: a bold typographic weight, +or italicised, underlined, and struck through text. + + The best way for users to add some extra attributes, such as a +foreground color, is to define their own faces and assign them to the +given emphasis marker/character. + + This is a custom face that extends the standard ‘bold’ face with a +red foreground value (so it colorises the text in addition to the bold +weight): + + (defface my-org-emphasis-bold + '((default :inherit bold) + (((class color) (min-colors 88) (background light)) + :foreground "#a60000") + (((class color) (min-colors 88) (background dark)) + :foreground "#ff8059")) + "My bold emphasis for Org.") + + This face definition reads as follows: + + • Always inherit the ‘bold’ face (*note Configure bold and italic + faces::). + • For versions of Emacs that support at least 88 colors (graphical + Emacs, for example) and use a light background, apply the ‘#a60000’ + value. + • For the same kind of Emacs that has a dark background use the + ‘#ff8059’ color instead. + + Same principle for how to extend ‘italic’ and ‘underline’ with, for +example, green and yellow hues, respectively: + + (defface my-org-emphasis-italic + '((default :inherit italic) + (((class color) (min-colors 88) (background light)) + :foreground "#005e00") + (((class color) (min-colors 88) (background dark)) + :foreground "#44bc44")) + "My italic emphasis for Org.") + + (defface my-org-emphasis-underline + '((default :inherit underline) + (((class color) (min-colors 88) (background light)) + :foreground "#813e00") + (((class color) (min-colors 88) (background dark)) + :foreground "#d0bc00")) + "My underline emphasis for Org.") + + In the case of a strike-through effect, we have no generic face to +inherit from, so we can write it as follows to also change the +foreground to a more subtle gray: + + (defface my-org-emphasis-strike-through + '((default :strike-through t) + (((class color) (min-colors 88) (background light)) + :foreground "#505050") + (((class color) (min-colors 88) (background dark)) + :foreground "#a8a8a8")) + "My strike-through emphasis for Org.") + + Or we can just change the color of the line that strikes through the +text to, for example, a shade of red: + + (defface my-org-emphasis-strike-through + '((((class color) (min-colors 88) (background light)) + :strike-through "#972500") + (((class color) (min-colors 88) (background dark)) + :strike-through "#ef8b50")) + "My strike-through emphasis for Org.") + + It is possible to combine those effects: + + (defface my-org-emphasis-strike-through + '((((class color) (min-colors 88) (background light)) + :strike-through "#972500" :foreground "#505050") + (((class color) (min-colors 88) (background dark)) + :strike-through "#ef8b50" :foreground "#a8a8a8")) + "My strike-through emphasis for Org.") + + One may inspect the variables ‘modus-themes-operandi-colors’ and +‘modus-themes-vivendi-colors’ for possible color values. Or call the +command ‘modus-themes-list-colors’ to show a buffer that previews each +entry in the palette. + + *note Visualize the active Modus theme’s palette: Preview theme +colors. + + Once we have defined the faces we need, we must update the +‘org-emphasis-alist’. Given that ‘org-verbatim’ and ‘org-code’ are +already styled by the themes, it probably is best not to edit them: + + (setq org-emphasis-alist + '(("*" my-org-emphasis-bold) + ("/" my-org-emphasis-italic) + ("_" my-org-emphasis-underline) + ("=" org-verbatim verbatim) + ("~" org-code verbatim) + ("+" my-org-emphasis-strike-through))) + + That’s it! For changes to take effect in already visited Org files, +invoke ‘M-x org-mode-restart’. + + +File: docGYh7V6.info, Node: Update Org block delimiter fontification, Next: Measure color contrast, Prev: Custom Org emphasis faces, Up: Advanced customization + +5.16 Update Org block delimiter fontification +============================================= + +As noted in the section about ‘modus-themes-org-blocks’, Org contains a +variable that determines whether the block’s begin and end lines are +extended to the edge of the window (*note Option for org-mode block +styles: Org mode blocks.). The variable is +‘org-fontify-whole-block-delimiter-line’. + + Users who change the style of Org blocks from time to time may prefer +to automatically update delimiter line fontification, such as with the +following setup: + + (defun my-modus-themes-org-fontify-block-delimiter-lines () + "Match `org-fontify-whole-block-delimiter-line' to theme style. + Run this function at the post theme load phase, such as with the + `modus-themes-after-load-theme-hook'." + (if (eq modus-themes-org-blocks 'gray-background) + (setq org-fontify-whole-block-delimiter-line t) + (setq org-fontify-whole-block-delimiter-line nil))) + + (add-hook 'modus-themes-after-load-theme-hook + #'my-modus-themes-org-fontify-block-delimiter-lines) + + Then ‘M-x org-mode-restart’ for changes to take effect, though manual +intervention can be circumvented by tweaking the function thus: + + (defun my-modus-themes-org-fontify-block-delimiter-lines () + "Match `org-fontify-whole-block-delimiter-line' to theme style. + Run this function at the post theme load phase, such as with the + `modus-themes-after-load-theme-hook'." + (if (eq modus-themes-org-blocks 'gray-background) + (setq org-fontify-whole-block-delimiter-line t) + (setq org-fontify-whole-block-delimiter-line nil)) + (when (derived-mode-p 'org-mode) + (font-lock-flush))) + + +File: docGYh7V6.info, Node: Measure color contrast, Next: Load theme depending on time of day, Prev: Update Org block delimiter fontification, Up: Advanced customization + +5.17 Measure color contrast +=========================== + +The themes provide the functions ‘modus-themes-wcag-formula’ and +‘modus-themes-contrast’. The former is a direct implementation of the +WCAG formula: <https://www.w3.org/TR/WCAG20-TECHS/G18.html>. It +calculates the relative luminance of a color value that is expressed in +hexadecimal RGB notation. While the latter function is just a +convenient wrapper for comparing the relative luminance between two +colors. + + In practice, one needs to work only with ‘modus-themes-contrast’. It +accepts two color values and returns their contrast ratio. Values range +from 1 to 21 (lowest to highest). The themes are designed to always be +equal or higher than 7 for each combination of background and foreground +that they use (this is the WCAG AAA standard—the most demanding of its +kind). + + A couple of examples (rounded numbers): + + ;; Pure white with pure green + (modus-themes-contrast "#ffffff" "#00ff00") + ;; => 1.37 + ;; That is an outright inaccessible combo + + ;; Pure black with pure green + (modus-themes-contrast "#000000" "#00ff00") + ;; => 15.3 + ;; That is a highly accessible combo + + It does not matter which color value comes first. The ratio is +always the same. + + If one does not wish to read all the decimal points, it is possible +to try something like this: + + (format "%0.2f" (modus-themes-contrast "#000000" "#00ff00")) + + While it is fine to perform such calculations on a case-by-case +basis, it is preferable to implement formulas and tables for more +demanding tasks. Such instruments are provided by ‘org-mode’ or +‘orgtbl-mode’, both of which are built into Emacs. Below is such a +table that derives the contrast ratio of all colors in the first column +(pure red, green, blue) relative to the color specified in the first row +of the second column (pure white) and rounds the results: + + | | #ffffff | + |---------+---------| + | #ff0000 | 4.00 | + | #00ff00 | 1.37 | + | #0000ff | 8.59 | + #+tblfm: $2='(modus-themes-contrast $1 @1$2);%0.2f + + To measure color contrast one needs to start from a known value. +This typically is the background. The Modus themes define an expanded +palette in large part because certain colors are only meant to be used +in combination with some others. Consult the source code for the +minutia and relevant commentary. + + Such knowledge may prove valuable while attempting to customize the +theme’s color palette. + + +File: docGYh7V6.info, Node: Load theme depending on time of day, Next: Backdrop for pdf-tools, Prev: Measure color contrast, Up: Advanced customization + +5.18 Load theme depending on time of day +======================================== + +While we do provide ‘modus-themes-toggle’ to manually switch between the +themes, users may also set up their system to perform such a task +automatically at sunrise and sunset. + + This can be accomplished by specifying the coordinates of one’s +location using the built-in ‘solar.el’ and then configuring the +‘circadian’ package: + + (use-package solar ; built-in + :config + (setq calendar-latitude 35.17 + calendar-longitude 33.36)) + + (use-package circadian ; you need to install this + :ensure t + :after solar + :config + (setq circadian-themes '((:sunrise . modus-operandi) + (:sunset . modus-vivendi))) + (circadian-setup)) + + +File: docGYh7V6.info, Node: Backdrop for pdf-tools, Next: Toggle themes without reloading them, Prev: Load theme depending on time of day, Up: Advanced customization + +5.19 Backdrop for pdf-tools +=========================== + +Most PDF files use a white background for their page, making it +impossible to discern the file’s boundaries in the buffer while using +the Modus Operandi theme. To introduce a distinction between the +buffer’s backdrop and the PDF page’s background, the former must be +rendered as some shade of gray. Ideally, ‘pdf-tools’ would provide a +face that the themes could support directly, though this does not seem +to be the case for the time being. We must thus employ the face +remapping technique that is documented elsewhere in this document to +change the buffer-local value of the ‘default’ face. + + *note Remap face with local value::. + + To remap the buffer’s backdrop, we start with a function like this +one: + + (defun my-pdf-tools-backdrop () + (modus-themes-with-colors + (face-remap-add-relative + 'default + `(:background ,bg-dim)))) + + (add-hook 'pdf-tools-enabled-hook #'my-pdf-tools-backdrop) + + The idea is to assign that function to a hook that gets called when +‘pdf-tools’ renders the document: ‘pdf-tools-enabled-hook’. This is +enough when you only use one theme. However it has the downside of +setting the background color value only at render time. In other words, +the face remapping function does not get evaluated anew whenever the +theme changes, such as upon invoking ‘M-x modus-themes-toggle’. + + To have our face remapping adapt gracefully while switching between +the Modus themes, we need to also account for the current theme and +control the activation of ‘pdf-view-midnight-minor-mode’. To which end +we arrive at something like the following, which builds on the above +example: + + (defun my-pdf-tools-backdrop () + (modus-themes-with-colors + (face-remap-add-relative + 'default + `(:background ,bg-dim)))) + + (defun my-pdf-tools-midnight-mode-toggle () + (when (derived-mode-p 'pdf-view-mode) + (if (eq (car custom-enabled-themes) 'modus-vivendi) + (pdf-view-midnight-minor-mode 1) + (pdf-view-midnight-minor-mode -1)) + (my-pdf-tools-backdrop))) + + (defun my-pdf-tools-themes-toggle () + (mapc + (lambda (buf) + (with-current-buffer buf + (my-pdf-tools-midnight-mode-toggle))) + (buffer-list))) + + (add-hook 'pdf-tools-enabled-hook #'my-pdf-tools-midnight-mode-toggle) + (add-hook 'modus-themes-after-load-theme-hook #'my-pdf-tools-themes-toggle) + + With those in place, PDFs have a distinct backdrop for their page, +while buffers with major-mode as ‘pdf-view-mode’ automatically switches +to dark mode when ‘modus-themes-toggle’ is called. + + +File: docGYh7V6.info, Node: Toggle themes without reloading them, Next: A theme-agnostic hook for theme loading, Prev: Backdrop for pdf-tools, Up: Advanced customization + +5.20 Toggle themes without reloading them +========================================= + +Users who have a stable setup and who only ever need to toggle between +the themes without triggering a full reload, are better off defining +their own command which calls ‘enable-theme’ instead of ‘load-theme’: + + (defun my-modus-themes-toggle () + "Toggle between `modus-operandi' and `modus-vivendi' themes. + This uses `enable-theme' instead of the standard method of + `load-theme'. The technicalities are covered in the Modus themes + manual." + (interactive) + (pcase (modus-themes--current-theme) + ('modus-operandi (progn (enable-theme 'modus-vivendi) + (disable-theme 'modus-operandi))) + ('modus-vivendi (progn (enable-theme 'modus-operandi) + (disable-theme 'modus-vivendi))) + (_ (error "No Modus theme is loaded; evaluate `modus-themes-load-themes' first")))) + + *note Differences between loading and enabling::. + + Recall that ‘modus-themes-toggle’ uses ‘load-theme’. + + +File: docGYh7V6.info, Node: A theme-agnostic hook for theme loading, Next: Use more spacious margins or padding in Emacs frames, Prev: Toggle themes without reloading them, Up: Advanced customization + +5.21 A theme-agnostic hook for theme loading +============================================ + +The themes are designed with the intent to be useful to Emacs users of +varying skill levels, from beginners to experts. This means that we try +to make things easier by not expecting anyone reading this document to +be proficient in Emacs Lisp or programming in general. + + Such a case is with the use of ‘modus-themes-after-load-theme-hook’, +which runs after the ‘modus-themes-load-theme’ function (used by the +command ‘modus-themes-toggle’). We recommend using that hook for +advanced customizations, because (1) we know for sure that it is +available once the themes are loaded, and (2) anyone consulting this +manual, especially the sections on enabling and loading the themes, will +be in a good position to benefit from that hook. + + Advanced users who have a need to switch between the Modus themes and +other items will find that such a hook does not meet their requirements: +it only works with the Modus themes and only with the aforementioned +functions. + + A theme-agnostic setup can be configured thus: + + (defvar after-enable-theme-hook nil + "Normal hook run after enabling a theme.") + + (defun run-after-enable-theme-hook (&rest _args) + "Run `after-enable-theme-hook'." + (run-hooks 'after-enable-theme-hook)) + + (advice-add 'enable-theme :after #'run-after-enable-theme-hook) + + This creates the ‘after-enable-theme-hook’ and makes it run after +each call to ‘enable-theme’, which means that it will work for all +themes and also has the benefit that it does not depend on functions +such as ‘modus-themes-toggle’ and the others mentioned above. +‘enable-theme’ is called internally by ‘load-theme’, so the hook works +everywhere. + + The downside of the theme-agnostic hook is that any functions added +to it will likely not be able to benefit from macro calls that read the +active theme, such as ‘modus-themes-with-colors’. Not all Emacs themes +have the same capabilities. + + In this document, we cover ‘modus-themes-after-load-theme-hook’ +though the user can replace it with ‘after-enable-theme-hook’ should +they need to (provided they understand the implications). + + +File: docGYh7V6.info, Node: Use more spacious margins or padding in Emacs frames, Next: Custom hl-todo colors, Prev: A theme-agnostic hook for theme loading, Up: Advanced customization + +5.22 Use more spacious margins or padding in Emacs frames +========================================================= + +[ UPDATE 2023-06-25: Instead of following these instructions, you can +simply install my ‘spacious-padding’ package from GNU ELPA. It +implements the padding and provides relevant user options. ] + + By default, Emacs frames try to maximize the number of characters +that fit in the current visible portion of the buffer. Users may prefer +to have some extra padding instead. This can make Emacs frames look +more pleasant, but also make it easier to identify the currently active +window. + + The way to implement such padding is two-fold: + + 1. In the ‘early-init.el’ file instruct Emacs to use a higher value + for the ‘internal-border-width’ of all frames, as well as for the + ‘right-divider-width’. The former concerns the outer boundaries of + Emacs frames, while the latter pertains to dividers between Emacs + windows. + + 2. Make the relevant faces invisible by changing the value of their + relevant attributes to that of the current theme’s main background. + + The parameters of Emacs frames are specified in the variables +‘initial-frame-alist’ and ‘default-frame-alist’. The “initial frame” +refers to the first frame that appears on Emacs startup. The “default” +refers to the fallback values that apply to all other frames that Emacs +creates (unless those are explicitly overridden by a bespoke +‘make-frame’ call). + + In detail, first we use the same values for the two frame alist +variables: + + ;; This must go in the early-init.el so that it applies to the initial + ;; frame. + (dolist (var '(default-frame-alist initial-frame-alist)) + (add-to-list var '(right-divider-width . 20)) + (add-to-list var '(internal-border-width . 20))) + + What the ‘dolist’ does is to call ‘add-to-list’ for the two variables +we specify there. This economizes on typing. + + Then we define a function that makes the relevant faces invisible. +The reason we do this with a function is so we can hook it to the “post +load” phase of a theme, thus applying the new background value +(otherwise you keep the old background, which likely means that the +faces will no longer be invisible). + + (defun my-modus-themes-invisible-dividers () + "Make window dividers invisible. + Add this to the `modus-themes-post-load-hook'." + (let ((bg (face-background 'default))) + (custom-set-faces + `(fringe ((t :background ,bg :foreground ,bg))) + `(window-divider ((t :background ,bg :foreground ,bg))) + `(window-divider-first-pixel ((t :background ,bg :foreground ,bg))) + `(window-divider-last-pixel ((t :background ,bg :foreground ,bg)))))) + + (add-hook 'modus-themes-post-load-hook #'my-modus-themes-invisible-dividers) + + The above will work only for themes that belong to the Modus family. +For users of Emacs version 29 or higher, there exists a theme-agnostic +hook that takes a function with one argument—that of the theme—and calls +in the the “post enable” phase of theme loading. Here is the above +snippet, with the necessary tweaks: + + (defun my-modus-themes-invisible-dividers (_theme) + "Make window dividers for THEME invisible." + (let ((bg (face-background 'default))) + (custom-set-faces + `(fringe ((t :background ,bg :foreground ,bg))) + `(window-divider ((t :background ,bg :foreground ,bg))) + `(window-divider-first-pixel ((t :background ,bg :foreground ,bg))) + `(window-divider-last-pixel ((t :background ,bg :foreground ,bg)))))) + + (add-hook 'enable-theme-functions #'my-modus-themes-invisible-dividers) + + Users of older versions of Emacs can read the entry herein about +defining their own theme-agnostic hook (*note A theme-agnostic hook for +theme loading::). + + +File: docGYh7V6.info, Node: Custom hl-todo colors, Next: Add support for solaire-mode, Prev: Use more spacious margins or padding in Emacs frames, Up: Advanced customization + +5.23 Custom hl-todo colors +========================== + +The ‘hl-todo’ package provides the user option ‘hl-todo-keyword-faces’: +it specifies a pair of keyword and corresponding color value. The Modus +themes configure that option in the interest of legibility. While this +works for our purposes, users may still prefer to apply their custom +values, in which case the following approach is necessary: + + (defun my-modus-themes-hl-todo-faces () + (setq hl-todo-keyword-faces '(("TODO" . "#ff0000") + ("HACK" . "#ffff00") + ("XXX" . "#00ffff") + ("NOTE" . "#ff00ff")))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces) + + Or include a ‘let’ form, if needed: + + (defun my-modus-themes-hl-todo-faces () + (let ((red "#ff0000") + (blue "#0000ff")) + (setq hl-todo-keyword-faces `(("TODO" . ,blue) + ("HACK" . ,red) + ("XXX" . ,red) + ("NOTE" . ,blue))))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces) + + Normally, we do not touch user options, though this is an exception: +otherwise the defaults are not always legible. + + +File: docGYh7V6.info, Node: Add support for solaire-mode, Prev: Custom hl-todo colors, Up: Advanced customization + +5.24 Add support for solaire-mode +================================= + +The ‘solaire-mode’ package dims the background of what it considers +ancillary “UI” buffers, such as the minibuffer and Dired buffers. The +Modus themes used to support Solaire on the premise that the user was +(i) opting in to it, (ii) understood why certain buffers were more gray, +and (iii) knew what other adjustments had to be made to prevent broken +visuals (e.g. the default style of the ‘modus-themes-completions’ uses +a subtle gray background for the selection, which with Solaire becomes +practically invisible). + + However, the assumption that users opt in to this feature does not +always hold true. There are cases where it is enabled by defaultsuch as +in the popular Doom Emacs configuration. Thus, the unsuspecting user +who loads ‘modus-operandi’ or ‘modus-vivendi’ without the requisite +customizations is getting a sub-par experience; an experience that we +did not intend and cannot genuinely fix. + + Because the Modus themes are meant to work everywhere, we cannot make +an exception for Doom Emacs and/or Solaire users. Furthermore, we shall +not introduce hacks, such as by adding a check in all relevant faces to +be adjusted based on Solaire or whatever other package. Hacks of this +sort are unsustainable and penalize the entire userbase. Besides, the +themes are built into Emacs and we must keep their standard high. + + The fundamental constraint with Solaire is that Emacs does not have a +real distinction between “content” and “UI” buffers. For themes to work +with Solaire, they need to be designed around that package. Such is an +arrangement that compromises on our accessibility standards and/or +hinders our efforts to provide the best possible experience while using +the Modus themes. + + As such, ‘solaire-mode’ is not—and will not be—supported by the Modus +themes (or any other of my themes, for that matter). Users who want it +must style the faces manually. Below is some sample code, based on what +we cover at length elsewhere in this manual: + + *note Advanced customization::. + + *note Use theme colors in code with modus-themes-with-colors::. + + (defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + `(solaire-default-face ((,c :inherit default :background ,bg-dim :foreground ,fg-dim))) + `(solaire-line-number-face ((,c :inherit solaire-default-face :foreground ,fg-unfocused))) + `(solaire-hl-line-face ((,c :background ,bg-active))) + `(solaire-org-hide-face ((,c :background ,bg-dim :foreground ,bg-dim)))))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) + + As always, re-load the theme for changes to take effect. + + +File: docGYh7V6.info, Node: Face coverage, Next: Notes on individual packages, Prev: Advanced customization, Up: Top + +6 Face coverage +*************** + +The Modus themes try to provide as close to full face coverage as +possible. This is necessary to ensure a consistently accessible reading +experience across all available interfaces. + +* Menu: + +* Supported packages:: Full list of covered face groups +* Indirectly covered packages:: + + +File: docGYh7V6.info, Node: Supported packages, Next: Indirectly covered packages, Up: Face coverage + +6.1 Full support for packages or face groups +============================================ + +This list will always be updated to reflect the current state of the +project. The idea is to offer an overview of the known status of all +affected face groups. The items with an appended asterisk ‘*’ tend to +have lots of extensions, so the “full support” may not be 100% true… + + • ace-window + • agda2-mode + • all-the-icons + • all-the-icons-dired + • all-the-icons-ibuffer + • annotate + • ansi-color + • anzu + • auctex and TeX + • auto-dim-other-buffers + • avy + • bbdb + • binder + • breadcrumb + • bongo + • boon + • bookmark + • calendar and diary + • centaur-tabs + • change-log and log-view (such as ‘vc-print-log’, + ‘vc-print-root-log’) + • chart + • cider + • circe + • citar + • clojure-mode + • column-enforce-mode + • company-mode* + • compilation-mode + • completions + • consult + • corfu + • corfu-candidate-overlay + • corfu-quick + • counsel* + • cperl-mode + • crontab-mode + • csv-mode + • ctrlf + • custom (what you get with ‘M-x customize’) + • dashboard + • deadgrep + • deft + • devdocs + • dictionary + • diff-hl + • diff-mode + • dim-autoload + • dired + • dired-async + • dired-git + • dired-git-info + • dired-narrow + • dired-subtree + • diredfl + • disk-usage + • display-fill-column-indicator-mode + • doom-modeline + • ediff + • ein (Emacs IPython Notebook) + • eglot + • el-search + • eldoc-box + • elfeed + • elfeed-score + • elpher + • embark + • ement + • emms + • enh-ruby-mode (enhanced-ruby-mode) + • epa + • erc + • ert + • erts-mode + • eshell + • eshell-fringe-status + • evil* (evil-mode) + • eww + • exwm + • eyebrowse + • flycheck + • flycheck-color-mode-line + • flycheck-indicator + • flymake + • flyspell + • flx + • focus + • fold-this + • font-lock (generic syntax highlighting) + • geiser + • git-commit + • git-gutter (and variants) + • git-rebase + • git-timemachine + • gnus + • gotest + • golden-ratio-scroll-screen + • helpful + • highlight-numbers + • highlight-parentheses (*note Note on highlight-parentheses.el: Note + on highlight-parenthesesel.) + • highlight-thing + • hl-fill-column + • hl-line-mode + • hl-todo + • hydra + • ibuffer + • icomplete + • ido-mode + • iedit + • iflipb + • image-dired + • imenu-list + • indium + • info + • info+ (info-plus) + • info-colors + • ioccur + • isearch, occur, etc. + • ivy* + • ivy-posframe + • japanese-holidays + • jira (org-jira) + • jit-spell + • jinx + • journalctl-mode + • js2-mode + • julia + • kaocha-runner + • keycast + • ledger-mode + • leerzeichen + • line numbers (‘display-line-numbers-mode’ and global variant) + • magit + • make-mode + • man + • marginalia + • markdown-mode + • markup-faces (‘adoc-mode’) + • messages + • minimap + • mode-line + • mood-line + • mpdel + • mu4e + • multiple-cursors + • nerd-icons + • nerd-icons-completion + • nerd-icons-dired + • nerd-icons-ibuffer + • neotree + • notmuch + • num3-mode + • nxml-mode + • olivetti + • orderless + • org* + • org-journal + • org-noter + • org-pomodoro + • org-recur + • org-roam + • org-superstar + • org-table-sticky-header + • org-tree-slide + • origami + • outline-mode + • outline-minor-faces + • package (what you get with ‘M-x list-packages’) + • page-break-lines + • pandoc-mode + • paren-face + • pass + • pdf-tools + • persp-mode + • perspective + • popup + • powerline + • prism (*note Note for prism.el: Note for prism.) + • prescient + • proced + • prodigy + • pulse + • pyim + • quick-peek + • rainbow-delimiters + • rcirc + • rcirc-color + • recursion-indicator + • regexp-builder (also known as ‘re-builder’) + • rg (rg.el) + • ripgrep + • rmail + • rst-mode + • ruler-mode + • sesman + • shell-script-mode + • shortdoc + • show-paren-mode + • shr + • side-notes + • sieve-mode + • skewer-mode + • slime (slbd) + • sly + • smart-mode-line + • smerge + • speedbar + • spell-fu + • stripes + • suggest + • switch-window + • swiper + • symbol-overlay + • syslog-mode + • tab-bar-mode + • tab-line-mode + • table (built-in ‘table.el’) + • telega + • terraform-mode + • term + • textsec + • transient (pop-up windows such as Magit’s) + • trashed + • tree-sitter + • tty-menu + • tuareg + • typescript + • undo-tree + • vc (‘vc-dir.el’, ‘vc-hooks.el’) + • vertico + • vertico-quick + • vimish-fold + • visible-mark + • visual-regexp + • vterm + • vundo + • wcheck-mode + • web-mode + • wgrep + • which-function-mode + • which-key + • whitespace-mode + • window-divider-mode + • writegood-mode + • woman + • xah-elisp-mode + • xterm-color (and ansi-colors) + • yaml-mode + • yasnippet + + Plus many other miscellaneous faces that are provided by Emacs. + + +File: docGYh7V6.info, Node: Indirectly covered packages, Prev: Supported packages, Up: Face coverage + +6.2 Indirectly covered packages +=============================== + +These do not require any extra styles because they are configured to +inherit from some basic faces or their dependencies which are directly +supported by the themes. + + • ag + • apropos + • apt-sources-list + • bbdb + • bm + • breakpoint (provided by the built-in ‘gdb-mi.el’ library) + • buffer-expose + • bufler + • counsel-notmuch + • counsel-org-capture-string + • css-mode + • dashboard (emacs-dashboard) + • define-word + • denote + • disk-usage + • dtache + • dynamic-ruler + • easy-kill + • ebdb + • edit-indirect + • egerrit + • elfeed-summary + • evil-owl + • flyspell-correct + • fortran-mode + • freeze-it + • forge + • git-walktree + • goggles + • highlight-defined + • highlight-escape-sequences (‘hes-mode’) + • icomplete-vertical + • i3wm-config-mode + • lin + • minibuffer-line + • no-emoji + • org-remark + • parrot + • perl-mode + • php-mode + • pulsar + • rjsx-mode + • side-hustle + • spell-fu + • swift-mode + • tab-bar-echo-area + • tide + • undo-hl + • vdiff + • vertico-indexed + • vertico-mouse + • xref + + +File: docGYh7V6.info, Node: Notes on individual packages, Next: Frequently Asked Questions, Prev: Face coverage, Up: Top + +7 Notes on individual packages +****************************** + +This section covers information that may be of interest to users of +individual packages. + +* Menu: + +* Note on calendar.el weekday and weekend colors: Note on calendarel weekday and weekend colors. +* Note on git-gutter in Doom Emacs:: +* Note on php-mode multiline comments:: +* Note on underlines in compilation buffers:: +* Note on inline Latex in Org buffers:: +* Note on dimmer.el: Note on dimmerel. +* Note on display-fill-column-indicator-mode:: +* Note on highlight-parentheses.el: Note on highlight-parenthesesel. +* Note on mmm-mode.el background colors: Note on mmm-modeel background colors. +* Note for prism:: +* Note on company-mode overlay pop-up:: +* Note on ERC escaped color sequences:: +* Note on powerline or spaceline:: +* Note on SHR colors:: +* Note on SHR fonts:: +* Note on Ement colors and fonts:: +* Note on pdf-tools link hints:: +* Note on the Notmuch logo:: +* Note on goto-address-mode faces:: + + +File: docGYh7V6.info, Node: Note on calendarel weekday and weekend colors, Next: Note on git-gutter in Doom Emacs, Up: Notes on individual packages + +7.1 Note on calendar.el weekday and weekend colors +================================================== + +By default, the ‘M-x calendar’ interface differentiates weekdays from +weekends by applying a gray color to the former and a faint red to the +latter. The idea for this approach is that the weekend should serve as +a subtle warning that no work is supposed to be done on that day, per +the design of traditional calendars. + + Users who prefer all days to look the same can configure the variable +‘calendar-weekend-days’ to either use gray of weekdays or the faint red +of weekends uniformly. + + ;; All are treated like weekdays (gray color) + (setq calendar-weekend-days nil) + + ;; All are treated like weekends (red-faint color) + (setq calendar-weekend-days (number-sequence 0 6)) + + ;; The default marks the Saturday and Sunday as the weekend + (setq calendar-weekend-days '(0 6)) + + For changes to take effect, the Calendar buffer needs to be generated +anew. + + +File: docGYh7V6.info, Node: Note on git-gutter in Doom Emacs, Next: Note on php-mode multiline comments, Prev: Note on calendarel weekday and weekend colors, Up: Notes on individual packages + +7.2 Note on git-gutter in Doom Emacs +==================================== + +The ‘git-gutter’ and ‘git-gutter-fr’ packages default to drawing bitmaps +for the indicators they display (e.g. bitmap of a plus sign for added +lines). In Doom Emacs, these bitmaps are replaced with contiguous lines +which may look nicer, but require a change to the foreground of the +relevant faces to yield the desired color combinations. + + Since this is Doom-specific, we urge users to apply changes in their +local setup. Below is some sample code, based on what we cover at +length elsewhere in this manual: + + *note Advanced customization::. + + *note Use theme colors in code with modus-themes-with-colors::. + + (defun my-modus-themes-custom-faces () + (modus-themes-with-colors + (custom-set-faces + ;; Make foreground the same as background for a uniform bar on + ;; Doom Emacs. + ;; + ;; Doom should not be implementing such hacks because themes + ;; cannot support them: + ;; <https://protesilaos.com/codelog/2022-08-04-doom-git-gutter-modus-themes/>. + `(git-gutter-fr:added ((,c :foreground ,bg-added-fringe))) + `(git-gutter-fr:deleted ((,c :foreground ,bg-removed-fringe))) + `(git-gutter-fr:modified ((,c :foreground ,bg-changed-fringe)))))) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces) + + As always, re-load the theme for changes to take effect. + + If the above does not work, try this instead: + + (after! modus-themes + (modus-themes-with-colors + (custom-set-faces + ;; Make foreground the same as background for a uniform bar on + ;; Doom Emacs. + ;; + ;; Doom should not be implementing such hacks because themes + ;; cannot support them: + ;; <https://protesilaos.com/codelog/2022-08-04-doom-git-gutter-modus-themes/>. + `(git-gutter-fr:added ((,c :foreground ,bg-added-intense))) + `(git-gutter-fr:deleted ((,c :foreground ,bg-removed-intense))) + `(git-gutter-fr:modified ((,c :foreground ,bg-changed-intense)))))) + + +File: docGYh7V6.info, Node: Note on php-mode multiline comments, Next: Note on underlines in compilation buffers, Prev: Note on git-gutter in Doom Emacs, Up: Notes on individual packages + +7.3 Note on php-mode multiline comments +======================================= + +Depending on your build of Emacs and/or the environment it runs in, +multiline comments in PHP with the ‘php-mode’ package use the +‘font-lock-doc-face’ instead of ‘font-lock-comment-face’. + + This seems to make all comments use the appropriate face: + + (defun my-multine-comments () + (setq-local c-doc-face-name 'font-lock-comment-face)) + + (add-hook 'php-mode-hook #'my-multine-comments) + + As always, re-load the theme for changes to take effect. + + +File: docGYh7V6.info, Node: Note on underlines in compilation buffers, Next: Note on inline Latex in Org buffers, Prev: Note on php-mode multiline comments, Up: Notes on individual packages + +7.4 Note on underlines in compilation buffers +============================================= + +Various buffers that produce compilation results or run tests on code +apply an underline to the file names they reference or to relevant +messages. Users may consider this unnecessary or excessive. + + To outright disable the effect, use this (buffers need to be +generated anew): + + (setq compilation-message-face nil) + + If some element of differentiation is still desired, a good option is +to render the affected text with the ‘italic’ face: + + (setq compilation-message-face 'italic) + + *note Configure bold and italic faces::. + + +File: docGYh7V6.info, Node: Note on inline Latex in Org buffers, Next: Note on dimmerel, Prev: Note on underlines in compilation buffers, Up: Notes on individual packages + +7.5 Note on inline Latex in Org buffers +======================================= + +Org can work with inline latex and related syntax. To actually fontify +those constructs, set the variable ‘org-highlight-latex-and-related’ to +the desired list of values (per its doc string). For example: + + (setq org-highlight-latex-and-related '(latex script)) + + Remember to use ‘M-x org-mode-restart’ for changes to take effect. + + +File: docGYh7V6.info, Node: Note on dimmerel, Next: Note on display-fill-column-indicator-mode, Prev: Note on inline Latex in Org buffers, Up: Notes on individual packages + +7.6 Note on dimmer.el +===================== + +The ‘dimmer.el’ library by Neil Okamoto can be configured to +automatically dim the colors of inactive Emacs windows. To guarantee +consistent results with the Modus themes, we suggest some tweaks to the +default styles, such as in this minimal setup: + + (use-package dimmer + :config + (setq dimmer-fraction 0.3) + (setq dimmer-adjustment-mode :foreground) + (setq dimmer-use-colorspace :rgb) + + (dimmer-mode 1)) + + Of the above, we strongly recommend the RGB color space because it is +the one that remains faithful to the hueness of the colors used by the +themes. Whereas the default CIELAB space has a tendency to distort +colors in addition to applying the dim effect, which can be somewhat +disorienting. + + The value of the ‘dimmer-fraction’ has been selected empirically. +Users might prefer to tweak it further (increasing it makes the dim +effect more pronounced). + + Changing the ‘dimmer-adjustment-mode’ is a matter of preference. +Though because the Modus themes use black and white as their base +colors, any other value for that variable will turn the main background +gray. This inadvertently leads to the opposite of the intended utility +of this package: it draws too much attention to unfocused windows. + + +File: docGYh7V6.info, Node: Note on display-fill-column-indicator-mode, Next: Note on highlight-parenthesesel, Prev: Note on dimmerel, Up: Notes on individual packages + +7.7 Note on display-fill-column-indicator-mode +============================================== + +The ‘display-fill-column-indicator-mode’ uses a typographic character to +draw its line. This has the downside of creating a dashed line. The +dashes are further apart depending on how tall the font’s glyph height +is and what integer the ‘line-spacing’ is set to. + + At the theme level we eliminate this effect by making the character +one pixel tall: the line is contiguous. Users who prefer the dashed +line are advised to change the ‘fill-column-indicator’ face, as +explained elsewhere in this document. For example: + + (modus-themes-with-colors + (custom-set-faces + `(fill-column-indicator ((,c :foreground ,bg-active))))) + + *note Use theme colors in code with modus-themes-with-colors::. + + To make the line thicker, set the height to be equal to the base font +size instead of the one pixel we use. This is done by specifying a rate +instead of an absolute number, as in ‘:height 1.0’ versus ‘:height 1’. +For example: + + (modus-themes-with-colors + (custom-set-faces + `(fill-column-indicator ((,c :height 1.0 :background ,bg-inactive :foreground ,bg-inactive))))) + + +File: docGYh7V6.info, Node: Note on highlight-parenthesesel, Next: Note on mmm-modeel background colors, Prev: Note on display-fill-column-indicator-mode, Up: Notes on individual packages + +7.8 Note on highlight-parentheses.el +==================================== + +The ‘highlight-parentheses’ package provides contextual coloration of +surrounding parentheses, highlighting only those which are around the +point. The package expects users to customize the applicable colors on +their own by configuring certain variables. + + To make the Modus themes work as expected with this, we need to use +some of the techniques that are discussed at length in the various +“Do-It-Yourself” (DIY) sections, which provide insight into the more +advanced customization options of the themes. + + *note Advanced customization::. + + In the following example, we are assuming that the user wants to (i) +re-use color variables provided by the themes, (ii) be able to retain +their tweaks while switching between ‘modus-operandi’ and +‘modus-vivendi’, and (iii) have the option to highlight either the +foreground of the parentheses or the background as well. + + We start by defining our own variable, which will serve as a toggle +between foreground and background coloration styles: + + (defvar my-highlight-parentheses-use-background t + "Prefer `highlight-parentheses-background-colors'.") + + Then we can update our preference with this: + + ;; Set to nil to disable backgrounds. + (setq my-highlight-parentheses-use-background nil) + + To re-use colors from the themes, we must wrap our code in the +‘modus-themes-with-colors’ macro. Our implementation must interface +with the variables ‘highlight-parentheses-background-colors’ and/or +‘highlight-parentheses-colors’. + + So we can have something like this (the doc string of +‘modus-themes-with-colors’ explains where the names of the colors can be +found): + + (modus-themes-with-colors + ;; Our preference for setting either background or foreground + ;; styles, depending on `my-highlight-parentheses-use-background'. + (if my-highlight-parentheses-use-background + + ;; Here we set color combinations that involve both a background + ;; and a foreground value. + (setq highlight-parentheses-background-colors (list bg-cyan-intense + bg-magenta-intense + bg-green-intense + bg-yellow-intense) + highlight-parentheses-colors (list cyan + magenta + green + yellow)) + + ;; And here we pass only foreground colors while disabling any + ;; backgrounds. + (setq highlight-parentheses-colors (list green-intense + magenta-intense + blue-intense + red-intense) + highlight-parentheses-background-colors nil))) + + ;; Include this if you also want to make the parentheses bold: + (set-face-attribute 'highlight-parentheses-highlight nil :inherit 'bold) + + ;; Our changes must be evaluated before enabling the relevant mode, so + ;; this comes last. + (global-highlight-parentheses-mode 1) + + For our changes to persist while switching between the Modus themes, +we need to include them in a function which can then get passed to +‘modus-themes-after-load-theme-hook’. This is the complete +implementation: + + ;; Configurations for `highlight-parentheses': + (require 'highlight-parentheses) + + (defvar my-highlight-parentheses-use-background t + "Prefer `highlight-parentheses-background-colors'.") + + (setq my-highlight-parentheses-use-background nil) ; Set to nil to disable backgrounds + + (defun my-modus-themes-highlight-parentheses () + (modus-themes-with-colors + ;; Our preference for setting either background or foreground + ;; styles, depending on `my-highlight-parentheses-use-background'. + (if my-highlight-parentheses-use-background + + ;; Here we set color combinations that involve both a background + ;; and a foreground value. + (setq highlight-parentheses-background-colors (list bg-cyan-intense + bg-magenta-intense + bg-green-intense + bg-yellow-intense) + highlight-parentheses-colors (list cyan + magenta + green + yellow)) + + ;; And here we pass only foreground colors while disabling any + ;; backgrounds. + (setq highlight-parentheses-colors (list green-intense + magenta-intense + blue-intense + red-intense) + highlight-parentheses-background-colors nil))) + + ;; Include this if you also want to make the parentheses bold: + (set-face-attribute 'highlight-parentheses-highlight nil :inherit 'bold) + + ;; Our changes must be evaluated before enabling the relevant mode, so + ;; this comes last. + (global-highlight-parentheses-mode 1)) + + (add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-highlight-parentheses) + + As always, re-load the theme for changes to take effect. + + +File: docGYh7V6.info, Node: Note on mmm-modeel background colors, Next: Note for prism, Prev: Note on highlight-parenthesesel, Up: Notes on individual packages + +7.9 Note on mmm-mode.el background colors +========================================= + +The faces used by ‘mmm-mode.el’ are expected to have a colorful +background, while they should not touch any foreground value. The idea +is that they must not interfere with existing fontification. Those +background colors need to be distinct from each other, such as an +unambiguous red juxtaposed with a clear blue. + + While this design may be internally consistent with the raison d’être +of that library, it inevitably produces inaccessible color combinations. + + There are two competing goals at play: + + 1. Legibility of the text, understood as the contrast ratio between + the background and the foreground. + + 2. Semantic precision of each face which entails faithfulness to + color-coding of the underlying background. + + As the Modus themes are designed with the express purpose of +conforming with the first point, we have to forgo the apparent +color-coding of the background elements. Instead we use subtle colors +that do not undermine the legibility of the affected text while they +still offer a sense of added context. + + Users who might prefer to fall below the minimum 7:1 contrast ratio +in relative luminance (the accessibility target we conform with), can +opt to configure the relevant faces on their own. + + *note Use theme colors in code with modus-themes-with-colors::. + + This example uses more vivid background colors, though it comes at +the very high cost of degraded legibility. + + (modus-themes-with-colors + (custom-set-faces + `(mmm-cleanup-submode-face ((,c :background ,bg-yellow-intense))) + `(mmm-code-submode-face ((,c :background ,bg-inactive))) + `(mmm-comment-submode-face ((,c :background ,bg-blue-intense))) + `(mmm-declaration-submode-face ((,c :background ,bg-cyan-intense))) + `(mmm-default-submode-face ((,c :background ,bg-dim))) + `(mmm-init-submode-face ((,c :background ,bg-magenta-intense))) + `(mmm-output-submode-face ((,c :background ,bg-red-intense))) + `(mmm-special-submode-face ((,c :background ,bg-green-intense))))) + + +File: docGYh7V6.info, Node: Note for prism, Next: Note on company-mode overlay pop-up, Prev: Note on mmm-modeel background colors, Up: Notes on individual packages + +7.10 Note on prism.el +===================== + +This package by Adam Porter, aka “alphapapa” or “github-alphapapa”, +implements an alternative to the typical coloration of code. Instead of +highlighting the syntactic constructs, it applies color to different +levels of depth in the code structure. + + As ‘prism.el’ offers a broad range of customizations, we cannot style +it directly at the theme level: that would run contrary to the spirit of +the package. Instead, we may offer preset color schemes. Those should +offer a starting point for users to adapt to their needs. + + In the following code snippets, we employ the +‘modus-themes-with-colors’ macro: *note Use theme colors in code with +modus-themes-with-colors::. + + These are the minimum recommended settings with 16 colors: + + (setq prism-num-faces 16) + + (prism-set-colors + :desaturations '(0) ; do not change---may lower the contrast ratio + :lightens '(0) ; same + :colors (modus-themes-with-colors + (list fg-main + magenta + cyan-cooler + magenta-cooler + blue + magenta-warmer + cyan-warmer + red-cooler + green + fg-main + cyan + yellow + blue-warmer + red-warmer + green-cooler + yellow-faint))) + + With 8 colors: + + (setq prism-num-faces 8) + + (prism-set-colors + :desaturations '(0) ; do not change---may lower the contrast ratio + :lightens '(0) ; same + :colors (modus-themes-with-colors + (list blue + magenta + magenta-cooler + cyan-cooler + fg-main + blue-warmer + red-cooler + cyan))) + + And this is with 4 colors, which produces results that are the +closest to the themes’ default aesthetic: + + (setq prism-num-faces 4) + + (prism-set-colors + :desaturations '(0) ; do not change---may lower the contrast ratio + :lightens '(0) ; same + :colors (modus-themes-with-colors + (list blue + magenta + magenta-cooler + green-warmer))) + + If you need to apply desaturation and lightening, you can use what +the ‘prism.el’ documentation recommends, like this (adapting to the +examples with the 4, 8, 16 colors): + + (prism-set-colors + :desaturations (cl-loop for i from 0 below 16 collect (* i 2.5)) + :lightens (cl-loop for i from 0 below 16 collect (* i 2.5)) + :colors (modus-themes-with-colors + (list fg-main + cyan-cooler + magenta-cooler + magenta))) + + +File: docGYh7V6.info, Node: Note on company-mode overlay pop-up, Next: Note on ERC escaped color sequences, Prev: Note for prism, Up: Notes on individual packages + +7.11 Note on company-mode overlay pop-up +======================================== + +By default, the ‘company-mode’ pop-up that lists completion candidates +is drawn using an overlay. This creates alignment issues every time it +is placed above a piece of text that has a different height than the +default. + + The solution recommended by the project’s maintainer is to use an +alternative front-end for drawing the pop-up which draws child frames +instead of overlays.(1)(2) + + Also consider the ‘corfu’ package. + + ---------- Footnotes ---------- + + (1) <https://github.com/company-mode/company-mode/issues/1010> + + (2) <https://github.com/tumashu/company-posframe/> + + +File: docGYh7V6.info, Node: Note on ERC escaped color sequences, Next: Note on powerline or spaceline, Prev: Note on company-mode overlay pop-up, Up: Notes on individual packages + +7.12 Note on ERC escaped color sequences +======================================== + +The built-in IRC client ‘erc’ has the ability to colorize any text using +escape sequences that start with ‘^C’ (inserted with ‘C-q C-c’) and are +followed by a number for the foreground and background.(1) Possible +numbers are 0-15, with the first entry being the foreground and the +second the background, separated by a comma. Like this ‘^C1,6’. The +minimum setup is this: + + (add-to-list 'erc-modules 'irccontrols) + (setq erc-interpret-controls-p t + erc-interpret-mirc-color t) + + As this allows users the chance to make arbitrary combinations, it is +impossible to guarantee a consistently high contrast ratio. All we can +we do is provide guidance on the combinations that satisfy the +accessibility standard of the themes: + +Modus Operandi + Use foreground color 1 for all backgrounds from 2-15. Like so: + ‘C-q C-c1’ where ‘N’ is the background. + +Modus Vivendi + Use foreground color 0 for all backgrounds from 2-13. Use + foreground ‘1’ for backgrounds 14, 15. + + Colors 0 and 1 are white and black respectively. So combine them +together, if you must. + + ---------- Footnotes ---------- + + (1) This page explains the basics, though it is not specific to +Emacs: <https://www.mirc.com/colors.html> + + +File: docGYh7V6.info, Node: Note on powerline or spaceline, Next: Note on SHR colors, Prev: Note on ERC escaped color sequences, Up: Notes on individual packages + +7.13 Note on powerline or spaceline +=================================== + +Both Powerline and Spaceline package users will likely need to use the +command ‘powerline-reset’ whenever they make changes to their themes +and/or mode line setup. + + +File: docGYh7V6.info, Node: Note on SHR colors, Next: Note on SHR fonts, Prev: Note on powerline or spaceline, Up: Notes on individual packages + +7.14 Note on SHR colors +======================= + +Emacs’ HTML rendering library (‘shr.el’) may need explicit configuration +to respect the theme’s colors instead of whatever specifications the +webpage provides. + + Consult the doc string of ‘shr-use-colors’. + + +File: docGYh7V6.info, Node: Note on SHR fonts, Next: Note on Ement colors and fonts, Prev: Note on SHR colors, Up: Notes on individual packages + +7.15 Note on SHR fonts +====================== + +By default, packages that build on top of the Simple HTML Remember +(‘shr’) use proportionately spaced fonts. This is controlled by the +user option ‘shr-use-fonts’, which is set to non-‘nil’ by default. To +use the standard font instead, set that variable to ‘nil’. + + *note Font configurations for Org and others::. + + Packages affected by this are: + + • elfeed + • ement + • eww + + This is a non-exhaustive list. + + +File: docGYh7V6.info, Node: Note on Ement colors and fonts, Next: Note on pdf-tools link hints, Prev: Note on SHR fonts, Up: Notes on individual packages + +7.16 Note on Ement colors and fonts +=================================== + +The ‘ement.el’ library by Adam Porter (also known as “alphapapa”) +defaults to a method of colorizing usernames in a rainbow style. This +is controlled by the user option ‘ement-room-prism’ and can be disabled +with: + + (setq ement-room-prism nil) + + The contrast ratio of these colors is governed by another user +option: ‘ement-room-prism-minimum-contrast’. By default, it is set to 6 +which is slightly below our nominal target. Try this instead: + + (setq ement-room-prism-minimum-contrast 7) + + With regard to fonts, Ement depends on ‘shr’ (*note Note on SHR +fonts::). + + Since we are here, here is an excerpt from Ement’s source code: + + (defcustom ement-room-prism-minimum-contrast 6 + "Attempt to enforce this minimum contrast ratio for user faces. + This should be a reasonable number from, e.g. 0-7 or so." + ;; Prot would almost approve of this default. :) I would go all the way + ;; to 7, but 6 already significantly dilutes the colors in some cases. + :type 'number) + + Yes, I do approve of that default. Even a 4.5 (the WCAG AA rating) +would be a good baseline for many themes and/or user configurations. +Our target is the highest of the sort, though we do not demand that +everyone conforms with it. + + +File: docGYh7V6.info, Node: Note on pdf-tools link hints, Next: Note on the Notmuch logo, Prev: Note on Ement colors and fonts, Up: Notes on individual packages + +7.17 Note on pdf-tools link hints +================================= + +Hints are drawn by ImageMagick (https://imagemagick.org/), not Emacs, +i.e., ImageMagick doesn’t know about the hint face unless you tell +ImageMagick about it. By default, only the foreground and background +color attributes are passed. The below snippet adds to those the +various font attributes. As it queries various faces, specifically +‘pdf-links-read-link’ and the faces it inherits, it needs to be added to +your initialization file after you’ve customized any faces. + + (use-package pdf-links + :config + (let ((spec + (apply #'append + (mapcar + (lambda (name) + (list name + (face-attribute 'pdf-links-read-link + name nil 'default))) + '(:family :width :weight :slant))))) + (setq pdf-links-read-link-convert-commands + `("-density" "96" + "-family" ,(plist-get spec :family) + "-stretch" ,(let* ((width (plist-get spec :width)) + (name (symbol-name width))) + (replace-regexp-in-string "-" "" + (capitalize name))) + "-weight" ,(pcase (plist-get spec :weight) + ('ultra-light "Thin") + ('extra-light "ExtraLight") + ('light "Light") + ('semi-bold "SemiBold") + ('bold "Bold") + ('extra-bold "ExtraBold") + ('ultra-bold "Black") + (_weight "Normal")) + "-style" ,(pcase (plist-get spec :slant) + ('italic "Italic") + ('oblique "Oblique") + (_slant "Normal")) + "-pointsize" "%P" + "-undercolor" "%f" + "-fill" "%b" + "-draw" "text %X,%Y '%c'")))) + + +File: docGYh7V6.info, Node: Note on the Notmuch logo, Next: Note on goto-address-mode faces, Prev: Note on pdf-tools link hints, Up: Notes on individual packages + +7.18 Note on the Notmuch logo +============================= + +By default, the “hello” buffer of Notmuch includes a header with the +programs’ logo and a couple of buttons. The logo has the effect of +enlarging the height of the line, which negatively impacts the shape of +those buttons. Disabling the logo fixes the problem: + + (setq notmuch-show-logo nil) + + +File: docGYh7V6.info, Node: Note on goto-address-mode faces, Prev: Note on the Notmuch logo, Up: Notes on individual packages + +7.19 Note on goto-address-mode faces +==================================== + +The built-in ‘goto-address-mode’ uses heuristics to identify URLs and +email addresses in the current buffer. It then applies a face to them +to change their style. Some packages, such as ‘notmuch’, use this +minor-mode automatically. + + The faces are not declared with ‘defface’, meaning that it is better +that the theme does not modify them. The user is thus encouraged to +consider including (or equivalent) this in their setup: + + (setq goto-address-url-face 'link + goto-address-url-mouse-face 'highlight + goto-address-mail-face 'link + goto-address-mail-mouse-face 'highlight) + + My personal preference is to set ‘goto-address-mail-face’ to ‘nil’, +as it otherwise adds too much visual noise to the buffer (email +addresses stand out more, due to the use of the uncommon ‘@’ character +but also because they are often enclosed in angled brackets). + + +File: docGYh7V6.info, Node: Frequently Asked Questions, Next: Contributing, Prev: Notes on individual packages, Up: Top + +8 Frequently Asked Questions +**************************** + +In this section we provide answers related to some aspects of the Modus +themes’ design and application. + +* Menu: + +* Is the contrast ratio about adjacent colors?:: +* What does it mean to avoid exaggerations?:: +* Why are colors mostly variants of blue, magenta, cyan?: Why are colors mostly variants of blue magenta cyan?. +* What is the best setup for legibility?:: +* Are these color schemes?:: +* Port the Modus themes to other platforms?:: + + +File: docGYh7V6.info, Node: Is the contrast ratio about adjacent colors?, Next: What does it mean to avoid exaggerations?, Up: Frequently Asked Questions + +8.1 Is the contrast ratio about adjacent colors? +================================================ + +The minimum contrast ratio in relative luminance that the themes conform +with always refers to any given combination of background and foreground +colors. If we have some blue colored text next to a magenta one, both +against a white background, we do not mean to imply that blue:magenta is +7:1 in terms of relative luminance. Rather, we state that blue:white +and magenta:white each are 7:1 or higher. + + The point of reference is always the background. Because colors have +about the same minimum distance in luminance from their backdrop, they +necessarily are fairly close to each other in this measure. A possible +blue:magenta combination would naturally be around 1:1 in contrast of +the sort here considered. + + To differentiate between sequential colors, we rely on hueness by +mapping contrasting hues to adjacent constructs, while avoiding +exaggerations. A blue next to a magenta can be told apart regardless of +their respective contrast ratio against their common background. +Exceptions would be tiny characters in arguably not so realistic cases, +such as two dots drawn side-by-side which for some reason would need to +be colored differently. They would still be legible though, which is +the primary objective of the Modus themes. + + +File: docGYh7V6.info, Node: What does it mean to avoid exaggerations?, Next: Why are colors mostly variants of blue magenta cyan?, Prev: Is the contrast ratio about adjacent colors?, Up: Frequently Asked Questions + +8.2 What does it mean to avoid exaggerations? +============================================= + +The Modus themes are designed with restraint, so that their default +looks do not overdo it with the application of color. + + *note Customization Options: Customization options. + + This is the non-quantifiable aspect of the themes’ design: the +artistic part, if you will. There are a lot of cases where color can be +used inconsiderately, without accounting for layout, typographic, or +other properties of the presentation. For example, two headings with +distinct markers, such as leading asterisks in Org buffers, do not have +to have highly contrasting hues between them in order to be told apart: +the added element of contrast in hueness does not contribute +significantly more to the distinction between the headings than colors +whose hues are relatively closer to each other in the color space. + + Exaggerations can be hard to anticipate or identify. Multiple shades +of blue and magenta in the same context may not seem optimal: one might +think that it would be better to use highly contrasting hues to ensure +that all colors stand out, such as by placing blue next to yellow, next +to magenta, and green. That would, however, be a case of design for its +own sake; a case where color is being applied without consideration of +its end results in the given context. Too many contrasting hues in +close proximity force an erratic rate to how the eye jumps from one +piece of text to the next. Whereas multiple shades of, say, blue and +magenta can suffice to tell things apart and avoid excess coloration: a +harmonious rhythm. + + +File: docGYh7V6.info, Node: Why are colors mostly variants of blue magenta cyan?, Next: What is the best setup for legibility?, Prev: What does it mean to avoid exaggerations?, Up: Frequently Asked Questions + +8.3 Why are colors mostly variants of blue, magenta, cyan? +========================================================== + +Due to the innate properties of color, some options are better than +others for the accessibility purposes of the themes, the stylistic +consistency between ‘modus-operandi’ and ‘modus-vivendi’, and the +avoidance of exaggerations in design. + + *note What does it mean to avoid exaggerations?:: + + What we describe as color is a function of three distinct channels of +light: red, green, blue. In hexadecimal RGB notation, a color value is +read as three pairs of red, green, and blue light: ‘#RRGGBB’. Of those +three, the most luminant is green, while the least luminant is blue. + + The three basic colors represent each of the channels of light. They +can be intermixed to give us six colors: red and green derive yellow, +green and blue make cyan, red and blue turn into magenta. + + We can test the luminance of each of those against white and black to +get a sense of how not all colors are equally good for accessibility +(white is ‘#ffffff’, which means that all three light channels are fully +luminated, while black is ‘#000000’ meaning that no light is present +(notwithstanding display technology)). + + | Name | | #ffffff | #000000 | + |---------+---------+---------+---------| + | red | #ff0000 | 4.00 | 5.25 | + | yellow | #ffff00 | 1.07 | 19.56 | + | green | #00ff00 | 1.37 | 15.30 | + | cyan | #00ffff | 1.25 | 16.75 | + | blue | #0000ff | 8.59 | 2.44 | + | magenta | #ff00ff | 3.14 | 6.70 | + + *note Measure color contrast::. + + By reading this table we learn that every color that has a high level +of green light (green, yellow, cyan) is virtually unreadable against a +white background and, conversely, can be easily read against black. + + We can then infer that red and blue, in different combinations, with +green acting as calibrator for luminance, will give us fairly moderate +colors that pass the 7:1 target. Blue with a bit of green produce +appropriate variants of cyan. Similarly, blue combined with some red +and hints of green give us suitable shades of purple. + + Due to the need of maintaining some difference in hueness between +adjacent colors, it is not possible to make red, green, and yellow the +main colors, because blue cannot be used to control their luminance and, +thus the relevant space will shrink considerably. + + *note Is the contrast ratio about adjacent colors?:: + + This phenomenon is best illustrated by the following table that +measures the relative luminance of shades of red, yellow, magenta +against white: + + | | #ffffff | + |---------+---------| + | #990000 | 8.92 | + | #995500 | 5.75 | + | #990099 | 7.46 | + + We notice that equal values of red and blue light in ‘#990099’ +(magenta shade) do not lead to a considerable change in luminance +compared with ‘#990000’ (red variant). Whereas less amount of green +light in ‘#995500’ leads to a major drop in luminance relative to white. +It follows that using the green channel of light to calibrate the +luminance of colors is more effective than trying to do the same with +either red or blue (the latter is the least effective in that regard). + + When we need to work with several colors, it is always better to have +sufficient manoeuvring space, especially since we cannot pick arbitrary +colors but only those that satisfy the accessibility objectives of the +themes. + + As for why we do not mostly use green, yellow, cyan for the dark +theme, it is because those colors are far more luminant than their +counterparts on the other side of the spectrum, so to ensure that they +all have about the same contrast ratios we would have to alter their +hueness considerably. In short, the effect would not be optimal as it +would lead to exaggerations. Plus, it would make ‘modus-vivendi’ look +completely different than ‘modus-operandi’, to the effect that the two +could not be properly considered part of the same project. + + +File: docGYh7V6.info, Node: What is the best setup for legibility?, Next: Are these color schemes?, Prev: Why are colors mostly variants of blue magenta cyan?, Up: Frequently Asked Questions + +8.4 What is the best setup for legibility? +========================================== + +The Modus themes can be conceptually simplified as combinations of color +values that account for relative luminance and inner harmony. Those +qualities do not guarantee that every end-user will have the same +experience, due to differences between people, but also because of +variances in hardware capabilities and configurations. For the purposes +of this document, we may only provide suggestions pertaining to the +latter case. + + ‘modus-operandi’ is best used outdoors or in a room that either gets +direct sunlight or has plenty of light. Whereas ‘modus-vivendi’ works +better when there is not a lot of sunshine or the room has a source of +light that is preferably a faint and/or warm one. It is possible to use +‘modus-operandi’ at night and ‘modus-vivendi’ during the day, though +that will depend on several variables, such as one’s overall perception +of color, the paint on the walls and how that contributes to the +impression of lightness in the room, the sense of space within the eye’s +peripheral vision, hardware specifications, and environmental factors. + + In general, an additional source of light other than that of the +monitor can help reduce eye strain: the eyes are more relaxed when they +do not have to focus on one point to gather light. + + The monitor’s display settings must be accounted for. Gamma values, +in particular, need to be calibrated to neither amplify nor distort the +perception of black. Same principle for sharpness, brightness, and +contrast as determined by the hardware, which all have an effect on how +text is read on the screen. + + There are software level methods on offer, such as the XrandR utility +for the X Window System (X.org), which can make gamma corrections for +each of the three channels of light (red, green, blue). For example: + + xrandr --output LVDS1 --brightness 1.0 --gamma 0.76:0.75:0.68 + + Typography is another variable. Some font families are blurry at +small point sizes. Others may have a regular weight that is lighter +(thiner) than that of their peers which may, under certain +circumstances, cause a halo effect around each glyph. + + The gist is that legibility cannot be fully solved at the theme +level. The color combinations may have been optimized for +accessibility, though the remaining contributing factors in each case +need to be considered in full. + + +File: docGYh7V6.info, Node: Are these color schemes?, Next: Port the Modus themes to other platforms?, Prev: What is the best setup for legibility?, Up: Frequently Asked Questions + +8.5 Are these color schemes? +============================ + +No, the Modus themes are not color schemes. + + A color scheme is a collection of colors. A good color scheme is a +combination of colors with an inner logic or abstract structure. + + A theme is a set of patterns that are applied across different +contexts. A good theme is one that does so with consistency, though not +uniformity. + + In practical terms, a color scheme is what one uses when, for +example, they replace the first sixteen escape sequences of a terminal +emulator with color values of their preference. The terminal offers the +option to choose, say, the exact value of what counts as “red”, but does +not provide the means to control where that is mapped to and whether it +should also have other qualities such as a bold weight for the +underlying text or an added background color. In contradistinction, +Emacs uses constructs known as “faces” which allow the user/developer to +specify where a given color will be used and whether it should be +accompanied by other typographic or stylistic attributes. + + By configuring the multitude of faces on offer we thus control both +which colors are applied and how they appear in their context. When a +package wants to render each instance of “foo” with the “bar” face, it +is not requesting a specific color, which makes things considerably more +flexible as we can treat “bar” in its own right without necessarily +having to use some color value that we hardcoded somewhere. + + Which brings us to the distinction between consistency and uniformity +where our goal is always the former: we want things to look similar +across all interfaces, but we must never force a visual identity where +that runs contrary to the functionality of the given interface. For +instance, all links are underlined by default yet there are cases such +as when viewing listings of emails in Gnus (and Mu4e, Notmuch) where (i) +it is already understood that one must follow the indicator or headline +to view its contents and (ii) underlining everything would make the +interface virtually unusable. + + Again, one must exercise judgement in order to avoid discrimination, +where “discrimination” refers to: + + • The treatment of substantially different magnitudes as if they were + of the same class. + • Or the treatment of the same class of magnitudes as if they were of + a different class. + + (To treat similar things differently; to treat dissimilar things +alike.) + + If, in other words, one is to enforce uniformity without accounting +for the particular requirements of each case—the contextual demands for +usability beyond matters of color—they are making a not-so-obvious error +of treating different cases as if they were the same. + + The Modus themes prioritize “thematic consistency” over abstract +harmony or regularity among their applicable colors. In concrete terms, +we do not claim that, say, our yellows are the best complements for our +blues because we generally avoid using complementary colors +side-by-side, so it is wrong to optimize for a decontextualised +blue+yellow combination. Not to imply that our colors do not work well +together because they do, just to clarify that consistency of context is +what themes must strive for, and that requires widening the scope of the +design beyond the particularities of a color scheme. + + Long story short: color schemes and themes have different +requirements. Please do not conflate the two. + + +File: docGYh7V6.info, Node: Port the Modus themes to other platforms?, Prev: Are these color schemes?, Up: Frequently Asked Questions + +8.6 Port the Modus themes to other platforms? +============================================= + +There is no plan to port the themes to other platforms or text editors. +I (Protesilaos) only use GNU Emacs and thus cannot maintain code that +targets software I am either not familiar with or am not using on a +daily basis. + + While it is possible to produce a simulacrum based on a given +template, doing so would run contrary to how this project is maintained +where details matter greatly. + + Each program has its own requirements so it won’t always be +possible—or indeed desirable—to have 1:1 correspondence between what +applies to Emacs and what should be done elsewhere. No port should ever +strive to be a copy of the Emacs implementation, as no other program is +an Emacs equivalent, but instead try to follow the spirit of the design. +For example, some of the customization options accept a list as their +value, or an alist, which may not be possible to reproduce on other +platforms. + + *note Customization options::. + + In other words, if something must be done differently on a certain +editor then that is acceptable so long as (i) the accessibility +standards are not compromised and (ii) the overall character of the +themes remains consistent. + + The former criterion should be crystal clear as it pertains to the +scientific foundations of the themes: high legibility and taking care of +the needs of users with red-green/blue-yellow color deficiency +(deuteranopia and tritanopia) by avoiding red+green color coding +paradigms and/or by providing yellow+blue variants for deuteranopia and +red+cyan for tritanopia (*note Overview::). + + The latter criterion is the “je ne sais quoi” of the artistic aspect +of the themes, which is partially fleshed out in this manual. + + *note Frequently Asked Questions::. + + With regard to the artistic aspect (where “art” qua skill may amount +to an imprecise science), there is no hard-and-fast rule in effect as it +requires one to exercize discretion and make decisions based on +context-dependent information or constraints. As is true with most +things in life, when in doubt, do not cling on to the letter of the law +but try to understand its spirit. + + For a trivial example: the curly underline that Emacs draws for +spelling errors is thinner than, e.g., what a graphical web browser has, +so if I was to design for an editor than has a thicker curly underline I +would make the applicable colors less intense to counterbalance the +typographic intensity of the added thickness. + + With those granted, if anyone is willing to develop a port of the +themes, they are welcome to contact me and I will do my best to help +them in their efforts. + + +File: docGYh7V6.info, Node: Contributing, Next: Acknowledgements, Prev: Frequently Asked Questions, Up: Top + +9 Contributing +************** + +This section documents the canonical sources of the themes and the ways +in which you can contribute to their ongoing development. + +* Menu: + +* Sources of the themes:: +* Issues you can help with:: +* Patches require copyright assignment to the FSF:: + + +File: docGYh7V6.info, Node: Sources of the themes, Next: Issues you can help with, Up: Contributing + +9.1 Sources of the themes +========================= + + • Package name (GNU ELPA): ‘modus-themes’ + • Official manual: <https://protesilaos.com/emacs/modus-themes> + • Change log: <https://protesilaos.com/emacs/modus-themes-changelog> + • Color palette: <https://protesilaos.com/emacs/modus-themes-colors> + • Sample pictures: + <https://protesilaos.com/emacs/modus-themes-pictures> + • Git repo on SourceHut: + <https://git.sr.ht/~protesilaos/modus-themes> + • Mirrors: + • GitHub: <https://github.com/protesilaos/modus-themes> + • GitLab: <https://gitlab.com/protesilaos/modus-themes> + • Mailing list: <https://lists.sr.ht/~protesilaos/modus-themes> + • Backronym: My Old Display Unexpectedly Sharpened ... themes + + +File: docGYh7V6.info, Node: Issues you can help with, Next: Patches require copyright assignment to the FSF, Prev: Sources of the themes, Up: Contributing + +9.2 Issues you can help with +============================ + +A few tasks you can help with by sending an email to the general +modus-themes public mailing list +(https://lists.sr.ht/~protesilaos/modus-themes). + + • Suggest refinements to packages that are covered. + • Report packages not covered thus far. + • Report bugs, inconsistencies, shortcomings. + • Help expand the documentation of covered-but-not-styled packages. + • Suggest refinements to the color palette. + • Help expand this document or any other piece of documentation. + • Send patches for code refinements (if you need, ask me for help + with Git—we all start out as beginners). + + *note Patches require copyright assignment to the FSF::. + + It is preferable that your feedback includes some screenshots, GIFs, +or short videos, as well as further instructions to reproduce a given +setup. Though this is not a requirement. + + Whatever you do, bear in mind the overarching objective of the Modus +themes: to keep a contrast ratio that is greater or equal to 7:1 between +background and foreground colors. If a compromise is ever necessary +between aesthetics and accessibility, it shall always be made in the +interest of the latter. + + +File: docGYh7V6.info, Node: Patches require copyright assignment to the FSF, Prev: Issues you can help with, Up: Contributing + +9.3 Patches require copyright assignment to the FSF +=================================================== + +Code contributions are most welcome. For any major edit (more than 15 +lines, or so, in aggregate per person), you need to make a copyright +assignment to the Free Software Foundation. This is necessary because +the themes are part of the upstream Emacs distribution: the FSF must at +all times be in a position to enforce the GNU General Public License. + + Copyright assignment is a simple process. Check the request form +below (please adapt it accordingly). You must write an email to the +address mentioned in the form and then wait for the FSF to send you a +legal agreement. Sign the document and file it back to them. This +could all happen via email and take about a week. You are encouraged to +go through this process. You only need to do it once. It will allow +you to make contributions to Emacs in general. + + Please email the following information to assign@gnu.org, and we + will send you the assignment form for your past and future changes. + + Please use your full legal name (in ASCII characters) as the subject + line of the message. + + REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES + + [What is the name of the program or package you're contributing to?] + + GNU Emacs + + [Did you copy any files or text written by someone else in these changes? + Even if that material is free software, we need to know about it.] + + Copied a few snippets from the same files I edited. Their author, + Protesilaos Stavrou, has already assigned copyright to the Free Software + Foundation. + + [Do you have an employer who might have a basis to claim to own + your changes? Do you attend a school which might make such a claim?] + + + [For the copyright registration, what country are you a citizen of?] + + + [What year were you born?] + + + [Please write your email address here.] + + + [Please write your postal address here.] + + + + + + [Which files have you changed so far, and which new files have you written + so far?] + + + +File: docGYh7V6.info, Node: Acknowledgements, Next: GNU Free Documentation License, Prev: Contributing, Up: Top + +10 Acknowledgements +******************* + +The Modus themes are a collective effort. Every bit of work matters. + +Author/maintainer + Protesilaos Stavrou. + +Contributions to code or documentation + Aleksei Gusev, Alex Griffin, Anders Johansson, Antonio Ruiz, Basil + L. Contovounesios, Björn Lindström, Carlo Zancanaro, Christian + Tietze, Daniel Mendler, David Edmondson, Eli Zaretskii, Fritz + Grabo, Gautier Ponsinet, Illia Ostapyshyn, Kévin Le Gouguec, Koen + van Greevenbroek, Kostadin Ninev, Madhavan Krishnan, Manuel Giraud, + Markus Beppler, Matthew Stevenson, Mauro Aranda, Nacho Barrientos, + Nicolas De Jaeghere, Paul David, Philip Kaludercic, Pierre + Téchoueyres, Rudolf Adamkovič, Sergey Nichiporchik, Shreyas + Ragavan, Stefan Kangas, Stephen Berman, Stephen Gildea, Steve + Downey, Tomasz Hołubowicz, Utkarsh Singh, Vincent Murphy, Xinglu + Chen, Yuanchen Xie, fluentpwn, okamsn. + +Ideas and user feedback + Aaron Jensen, Adam Porter, Adam Spiers, Adrian Manea, Aleksei + Pirogov, Alex Griffin, Alex Koen, Alex Peitsinis, Alexey Shmalko, + Alok Singh, Anders Johansson, André Alexandre Gomes, Andrew Tropin, + Antonio Hernández Blas, Arif Rezai, Augusto Stoffel, Basil L. + Contovounesios, Bernd Rellermeyer, Burgess Chang, Charlotte Van + Petegem, Christian Tietze, Christopher Dimech, Christopher League, + Damien Cassou, Daniel Mendler, Dario Gjorgjevski, David Edmondson, + Davor Rotim, Divan Santana, Eliraz Kedmi, Emanuele Michele Alberto + Monterosso, Farasha Euker, Feng Shu, Gautier Ponsinet, Gerry + Agbobada, Gianluca Recchia, Gonçalo Marrafa, Guilherme Semente, + Gustavo Barros, Hörmetjan Yiltiz, Ilja Kocken, Imran Khan, Iris + Garcia, Ivan Popovych, James Ferguson, Jeremy Friesen, Jerry Zhang, + Johannes Grødem, John Haman, Jonas Collberg, Jorge Morais, Joshua + O’Connor, Julio C. Villasante, Kenta Usami, Kevin Fleming, Kévin + Le Gouguec, Kevin Kainan Li, Kostadin Ninev, Laith Bahodi, Lasse + Lindner, Len Trigg, Lennart C. Karssen, Luis Miguel Castañeda, + Magne Hov, Manuel Giraud, Manuel Uberti, Mark Bestley, Mark Burton, + Mark Simpson, Marko Kocic, Markus Beppler, Matt Armstrong, Matthias + Fuchs, Mattias Engdegård, Mauro Aranda, Maxime Tréca, Michael + Goldenberg, Morgan Smith, Morgan Willcock, Murilo Pereira, Nicky + van Foreest, Nicolas De Jaeghere, Nicolas Semrau, Olaf Meeuwissen, + Oliver Epper, Pablo Stafforini, Paul Poloskov, Pengji Zhang, Pete + Kazmier, Peter Wu, Philip Kaludercic, Pierre Téchoueyres, + Przemysław Kryger, Robert Hepple, Roman Rudakov, Russell Sim, Ryan + Phillips, Rytis Paškauskas, Rudolf Adamkovič, Sam Kleinman, Samuel + Culpepper, Saša Janiška, Shreyas Ragavan, Simon Pugnet, Steve + Downey, Tassilo Horn, Thanos Apollo, Thibaut Verron, Thomas + Heartman, Togan Muftuoglu, Tony Zorman, Trey Merkley, Tomasz + Hołubowicz, Toon Claes, Uri Sharf, Utkarsh Singh, Vincent Foley, + Zoltan Kiraly. As well as users: Ben, CsBigDataHub1, Emacs + Contrib, Eugene, Fourchaux, Fredrik, Moesasji, Nick, Summer Emacs, + TheBlob42, TitusMu, Trey, bepolymathe, bit9tream, bangedorrunt, + derek-upham, doolio, fleimgruber, gitrj95, iSeeU, jixiuf, okamsn, + pRot0ta1p, soaringbird, tumashu, wakamenod. + +Packaging + Basil L. Contovounesios, Eli Zaretskii, Glenn Morris, Mauro Aranda, + Richard Stallman, Stefan Kangas (core Emacs), Stefan Monnier (GNU + Elpa), André Alexandre Gomes, Andrew Tropin, Dimakakos Dimos, + Morgan Smith, Nicolas Goaziou (Guix), Dhavan Vaidya (Debian). + +Inspiration for certain features + Bozhidar Batsov (zenburn-theme), Fabrice Niessen (leuven-theme). + + Special thanks (from A-Z) to Daniel Mendler, Gustavo Barros, Manuel +Uberti, Nicolas De Jaeghere, and Omar Antolín Camarena for their long +time contributions and insightful commentary on key aspects of the +themes’ design and/or aspects of their functionality. + + All errors are my own. + + +File: docGYh7V6.info, Node: GNU Free Documentation License, Next: Indices, Prev: Acknowledgements, Up: Top + +Appendix A GNU Free Documentation License +***************************************** + + Version 1.3, 3 November 2008 + + Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + <https://fsf.org/> + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document “free” in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of “copyleft”, which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + “Document”, below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as “you”. You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A “Modified Version” of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A “Secondary Section” is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document’s overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The “Invariant Sections” are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The “Cover Texts” are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A “Transparent” copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + “Transparent” is called “Opaque”. + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The “Title Page” means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, “Title + Page” means the text near the most prominent appearance of the + work’s title, preceding the beginning of the body of the text. + + The “publisher” means any person or entity that distributes copies + of the Document to the public. + + A section “Entitled XYZ” means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) + To “Preserve the Title” of such a section when you modify the + Document means that it remains a section “Entitled XYZ” according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document’s license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document’s + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled “History”, Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled “History” in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + “History” section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled “Acknowledgements” or “Dedications”, + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled “Endorsements”. Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + “Endorsements” or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version’s + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled “Endorsements”, provided it contains + nothing but endorsements of your Modified Version by various + parties—for example, statements of peer review or that the text has + been approved by an organization as the authoritative definition of + a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + “History” in the various original documents, forming one section + Entitled “History”; likewise combine any sections Entitled + “Acknowledgements”, and any sections Entitled “Dedications”. You + must delete all sections Entitled “Endorsements.” + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an “aggregate” if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation’s users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document’s Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled “Acknowledgements”, + “Dedications”, or “History”, the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + <https://www.gnu.org/licenses/>. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License “or any later version” applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy’s public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A “Massive Multiauthor Collaboration” (or “MMC”) contained in the + site means any set of copyrightable works thus published on the MMC + site. + + “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + “Incorporate” means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is “eligible for relicensing” if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the “with...Texts.” line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + +File: docGYh7V6.info, Node: Indices, Prev: GNU Free Documentation License, Up: Top + +B Indices +********* + +* Menu: + +* Function index:: +* Variable index:: +* Concept index:: + + +File: docGYh7V6.info, Node: Function index, Next: Variable index, Up: Indices + +B.1 Function index +================== + + +* Menu: + +* modus-themes-contrast: Measure color contrast. + (line 6) +* modus-themes-get-color-value: Get a single color from the palette. + (line 8) +* modus-themes-list-colors: Preview theme colors. (line 6) +* modus-themes-list-colors-current: Preview theme colors. (line 12) +* modus-themes-load-theme: Enable and load. (line 6) +* modus-themes-preview-colors: Preview theme colors. (line 25) +* modus-themes-preview-colors-current: Preview theme colors. (line 25) +* modus-themes-toggle: Enable and load. (line 6) +* modus-themes-wcag-formula: Measure color contrast. + (line 6) +* modus-themes-with-colors: Use theme colors in code with modus-themes-with-colors. + (line 12) + + +File: docGYh7V6.info, Node: Variable index, Next: Concept index, Prev: Function index, Up: Indices + +B.2 Variable index +================== + + +* Menu: + +* modus-operandi-deuteranopia-palette-overrides: Palette overrides. + (line 30) +* modus-operandi-palette-overrides: Palette overrides. (line 28) +* modus-operandi-tinted-palette-overrides: Palette overrides. (line 32) +* modus-operandi-tritanopia-palette-overrides: Palette overrides. + (line 34) +* modus-themes-after-load-theme-hook: Enable and load. (line 6) +* modus-themes-bold-constructs: Bold constructs. (line 6) +* modus-themes-common-palette-overrides: Palette overrides. (line 22) +* modus-themes-completions: Completion UIs. (line 6) +* modus-themes-custom-auto-reload: Custom reload theme. (line 6) +* modus-themes-disable-other-themes: Disable other themes. (line 6) +* modus-themes-headings: Heading styles. (line 6) +* modus-themes-italic-constructs: Italic constructs. (line 6) +* modus-themes-mixed-fonts: Mixed fonts. (line 6) +* modus-themes-org-blocks: Org mode blocks. (line 6) +* modus-themes-preset-overrides-cooler: Palette override presets. + (line 29) +* modus-themes-preset-overrides-faint: Palette override presets. + (line 16) +* modus-themes-preset-overrides-intense: Palette override presets. + (line 25) +* modus-themes-preset-overrides-warmer: Palette override presets. + (line 29) +* modus-themes-prompts: Command prompts. (line 6) +* modus-themes-variable-pitch-ui: UI typeface. (line 6) +* modus-vivendi-deuteranopia-palette-overrides: Palette overrides. + (line 38) +* modus-vivendi-palette-overrides: Palette overrides. (line 36) +* modus-vivendi-tinted-palette-overrides: Palette overrides. (line 40) +* modus-vivendi-tritanopia-palette-overrides: Palette overrides. + (line 42) + + +File: docGYh7V6.info, Node: Concept index, Prev: Variable index, Up: Indices + +B.3 Concept index +================= + + +* Menu: + +* Avoiding exaggerations in design: What does it mean to avoid exaggerations?. + (line 6) +* Bold and italic fonts: Configure bold and italic faces. + (line 6) +* Changelog: Learn about the latest changes. + (line 6) +* Color accuracy of terminal emulators: More accurate colors in terminal emulators. + (line 6) +* Color contrast: Measure color contrast. + (line 6) +* Contrast between adjacent colors: Is the contrast ratio about adjacent colors?. + (line 6) +* Contributing: Issues you can help with. + (line 6) +* Contributors: Acknowledgements. (line 6) +* Essential configuration: Enable and load. (line 6) +* Explicitly supported packages: Supported packages. (line 6) +* Font configurations: Font configurations for Org and others. + (line 6) +* Fonts in EWW, Elfeed, Ement, and SHR: Note on SHR fonts. (line 6) +* Frequently Asked Questions: Frequently Asked Questions. + (line 6) +* General setup for readability: What is the best setup for legibility?. + (line 6) +* Implicitly supported packages: Indirectly covered packages. + (line 6) +* Innate color qualities of the palette: Why are colors mostly variants of blue magenta cyan?. + (line 6) +* load-theme VS enable-theme: Differences between loading and enabling. + (line 6) +* Org custom emphasis faces: Custom Org emphasis faces. + (line 6) +* Org custom todo faces: Custom Org todo keyword and priority faces. + (line 6) +* Porting the themes to other editors: Port the Modus themes to other platforms?. + (line 6) +* Preview named colors or semantic color mappings: Preview theme colors. + (line 6) +* Pure white and pure black in terminal emulators: Range of color with terminal emulators. + (line 6) +* Remapping faces: Remap face with local value. + (line 6) +* Remapping pdf-tools backdrop: Backdrop for pdf-tools. + (line 6) +* sample configuration: Sample configuration with and without use-package. + (line 6) +* Screenshots: How do the themes look like. + (line 6) +* Sources of the themes: Sources of the themes. (line 6) +* Switch themes without load-theme: Toggle themes without reloading them. + (line 6) +* Themes, not color schemes: Are these color schemes?. + (line 6) +* Use colors from the palette anywhere: Use theme colors in code with modus-themes-with-colors. + (line 6) +* use-package configuration: Sample configuration with and without use-package. + (line 6) + + + +Tag Table: +Node: Top869 +Node: Overview8121 +Node: How do the themes look like10890 +Node: Learn about the latest changes11246 +Node: Installation11631 +Node: Install manually from source12558 +Node: Install from the archives13380 +Node: Install on GNU/Linux13976 +Node: Debian 11 Bullseye14466 +Node: GNU Guix14873 +Node: Dealing with byte compilation errors15153 +Node: Enable and load16308 +Node: The require-theme for built-in Emacs themes19159 +Node: Sample configuration with and without use-package20276 +Node: Differences between loading and enabling23184 +Node: Customization options25219 +Node: Custom reload theme28964 +Node: Disable other themes29881 +Node: Bold constructs31076 +Node: Italic constructs31910 +Node: Mixed fonts32678 +Node: Command prompts33671 +Node: Completion UIs35473 +Node: Org mode blocks38272 +Node: Heading styles40174 +Node: UI typeface44525 +Node: Palette overrides45453 +Node: Advanced customization49785 +Node: Palette override presets51445 +Node: Stylistic variants using palette overrides54234 +Node: Make the mode line borderless56143 +Node: Make the active mode line colorful57742 +Node: Make the tab bar more or less colorful59684 +Node: Make the fringe invisible or another color61912 +Node: Make links use subtle or no underlines63403 +Node: Make prompts more or less colorful64397 +Node: Make completion matches more or less colorful66058 +Node: Make comments yellow and strings green69955 +Node: Make code syntax use the old alt-syntax style71855 +Node: Make use of alternative styles for code syntax75133 +Node: Make matching parenthesis more or less intense78794 +Node: Make box buttons more or less gray80227 +Node: Make TODO and DONE more or less intense81530 +Node: Make headings more or less colorful83230 +Node: Make Org agenda more or less colorful85627 +Node: Make inline code in prose use alternative styles89084 +Node: Make mail citations and headers more or less colorful91622 +Node: Make the region preserve text colors plus other styles94314 +Node: Make mouse highlights more or less colorful96122 +Node: Make language underlines less colorful97426 +Node: Make line numbers use alternative styles98869 +Node: Make diffs use only a foreground100803 +Node: Make deuteranopia diffs red and blue instead of yellow and blue103570 +Node: Make the themes look like what the maintainer uses105989 +Node: More accurate colors in terminal emulators110684 +Node: Range of color with terminal emulators111973 +Node: Preview theme colors114684 +Node: Per-theme customization settings116526 +Node: Get a single color from the palette117869 +Node: Use theme colors in code with modus-themes-with-colors120114 +Node: Do not extend the region background122444 +Node: Add padding to mode line123239 +Node: Remap face with local value125800 +Node: Font configurations for Org and others128220 +Ref: Font configurations for Org and others-Footnote-1131126 +Node: Configure bold and italic faces131313 +Node: Custom Org todo keyword and priority faces135467 +Node: Custom Org emphasis faces139183 +Node: Update Org block delimiter fontification144003 +Node: Measure color contrast145917 +Node: Load theme depending on time of day148612 +Node: Backdrop for pdf-tools149619 +Node: Toggle themes without reloading them152515 +Node: A theme-agnostic hook for theme loading153788 +Node: Use more spacious margins or padding in Emacs frames156238 +Node: Custom hl-todo colors160325 +Node: Add support for solaire-mode161860 +Node: Face coverage164768 +Node: Supported packages165217 +Node: Indirectly covered packages170775 +Node: Notes on individual packages172141 +Node: Note on calendarel weekday and weekend colors173238 +Node: Note on git-gutter in Doom Emacs174383 +Node: Note on php-mode multiline comments176721 +Node: Note on underlines in compilation buffers177471 +Node: Note on inline Latex in Org buffers178305 +Node: Note on dimmerel178912 +Node: Note on display-fill-column-indicator-mode180394 +Node: Note on highlight-parenthesesel181790 +Node: Note on mmm-modeel background colors187765 +Node: Note for prism190062 +Node: Note on company-mode overlay pop-up193227 +Ref: Note on company-mode overlay pop-up-Footnote-1193954 +Ref: Note on company-mode overlay pop-up-Footnote-2194021 +Node: Note on ERC escaped color sequences194076 +Ref: Note on ERC escaped color sequences-Footnote-1195501 +Node: Note on powerline or spaceline195611 +Node: Note on SHR colors196022 +Node: Note on SHR fonts196443 +Node: Note on Ement colors and fonts197085 +Node: Note on pdf-tools link hints198592 +Node: Note on the Notmuch logo201049 +Node: Note on goto-address-mode faces201584 +Node: Frequently Asked Questions202699 +Node: Is the contrast ratio about adjacent colors?203327 +Node: What does it mean to avoid exaggerations?204831 +Node: Why are colors mostly variants of blue magenta cyan?206678 +Node: What is the best setup for legibility?210981 +Node: Are these color schemes?213623 +Node: Port the Modus themes to other platforms?217302 +Node: Contributing220143 +Node: Sources of the themes220537 +Node: Issues you can help with221428 +Node: Patches require copyright assignment to the FSF222816 +Node: Acknowledgements225033 +Node: GNU Free Documentation License229166 +Node: Indices254527 +Node: Function index254703 +Node: Variable index255883 +Node: Concept index258336 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/elpa/modus-themes-4.3.0/modus-vivendi-deuteranopia-theme.el b/elpa/modus-themes-4.3.0/modus-vivendi-deuteranopia-theme.el @@ -0,0 +1,485 @@ +;;; modus-vivendi-deuteranopia-theme.el --- Deuteranopia-optimized theme with a black background -*- lexical-binding:t -*- + +;; Copyright (C) 2019-2023 Free Software Foundation, Inc. + +;; Author: Protesilaos Stavrou <info@protesilaos.com> +;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> +;; URL: https://git.sr.ht/~protesilaos/modus-themes +;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes + +;; 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: +;; +;; The Modus themes conform with the highest standard for +;; color-contrast accessibility between background and foreground +;; values (WCAG AAA). Please refer to the official Info manual for +;; further documentation (distributed with the themes, or available +;; at: <https://protesilaos.com/emacs/modus-themes>). + +;;; Code: + + + +(eval-and-compile + (unless (and (fboundp 'require-theme) + load-file-name + (equal (file-name-directory load-file-name) + (expand-file-name "themes/" data-directory)) + (require-theme 'modus-themes t)) + (require 'modus-themes)) + +;;;###theme-autoload + (deftheme modus-vivendi-deuteranopia + "Deuteranopia-optimized theme with a black background. +This variant is optimized for users with red-green color +deficiency (deuteranopia). It conforms with the highest +legibility standard for color contrast between background and +foreground in any given piece of text, which corresponds to a +minimum contrast in relative luminance of 7:1 (WCAG AAA +standard)." + :background-mode 'dark + :kind 'color-scheme + :family 'modus) + + (defconst modus-vivendi-deuteranopia-palette + '( +;;; Basic values + + (bg-main "#000000") + (bg-dim "#1e1e1e") + (fg-main "#ffffff") + (fg-dim "#989898") + (fg-alt "#c6daff") + (bg-active "#535353") + (bg-inactive "#303030") + (border "#646464") + +;;; Common accent foregrounds + + (red "#ff5f59") + (red-warmer "#ff6b55") + (red-cooler "#ff7f9f") + (red-faint "#ff9580") + (red-intense "#ff5f5f") + (green "#44bc44") + (green-warmer "#70b900") + (green-cooler "#00c06f") + (green-faint "#88ca9f") + (green-intense "#44df44") + (yellow "#cabf00") + (yellow-warmer "#ffa00f") + (yellow-cooler "#d8af7a") + (yellow-faint "#d2b580") + (yellow-intense "#efef00") + (blue "#2fafff") + (blue-warmer "#79a8ff") + (blue-cooler "#00bcff") + (blue-faint "#82b0ec") + (blue-intense "#338fff") + (magenta "#feacd0") + (magenta-warmer "#f78fe7") + (magenta-cooler "#b6a0ff") + (magenta-faint "#caa6df") + (magenta-intense "#ff66ff") + (cyan "#00d3d0") + (cyan-warmer "#4ae2f0") + (cyan-cooler "#6ae4b9") + (cyan-faint "#9ac8e0") + (cyan-intense "#00eff0") + +;;; Uncommon accent foregrounds + + (rust "#db7b5f") + (gold "#c0965b") + (olive "#9cbd6f") + (slate "#76afbf") + (indigo "#9099d9") + (maroon "#cf7fa7") + (pink "#d09dc0") + +;;; Common accent backgrounds + + (bg-red-intense "#9d1f1f") + (bg-green-intense "#2f822f") + (bg-yellow-intense "#7a6100") + (bg-blue-intense "#1640b0") + (bg-magenta-intense "#7030af") + (bg-cyan-intense "#2266ae") + + (bg-red-subtle "#620f2a") + (bg-green-subtle "#00422a") + (bg-yellow-subtle "#4a4000") + (bg-blue-subtle "#242679") + (bg-magenta-subtle "#552f5f") + (bg-cyan-subtle "#004065") + + (bg-red-nuanced "#2c0614") + (bg-green-nuanced "#001904") + (bg-yellow-nuanced "#221000") + (bg-blue-nuanced "#0f0e39") + (bg-magenta-nuanced "#230631") + (bg-cyan-nuanced "#041529") + +;;; Uncommon accent backgrounds + + (bg-ochre "#442c2f") + (bg-lavender "#38325c") + (bg-sage "#0f3d30") + +;;; Graphs + + (bg-graph-red-0 "#bf6000") + (bg-graph-red-1 "#733500") + (bg-graph-green-0 "#6fbf8f") + (bg-graph-green-1 "#2f5f4f") + (bg-graph-yellow-0 "#c1c00a") + (bg-graph-yellow-1 "#7f6640") + (bg-graph-blue-0 "#0f90ef") + (bg-graph-blue-1 "#1f2f8f") + (bg-graph-magenta-0 "#7f7f8e") + (bg-graph-magenta-1 "#4f4f5f") + (bg-graph-cyan-0 "#376f9a") + (bg-graph-cyan-1 "#00404f") + +;;; Special purpose + + (bg-completion "#2f447f") + (bg-hover "#45605e") + (bg-hover-secondary "#654a39") + (bg-hl-line "#2f3849") + (bg-region "#5a5a5a") + (fg-region "#ffffff") + + (bg-char-0 "#0050af") + (bg-char-1 "#7f1f7f") + (bg-char-2 "#625a00") + + (bg-mode-line-active "#2a2a6a") + (fg-mode-line-active "#f0f0f0") + (border-mode-line-active "#8080a7") + (bg-mode-line-inactive "#2d2d2d") + (fg-mode-line-inactive "#969696") + (border-mode-line-inactive "#606060") + + (modeline-err "#e5bf00") + (modeline-warning "#c0cf35") + (modeline-info "#abeadf") + + (bg-tab-bar "#313131") + (bg-tab-current "#000000") + (bg-tab-other "#545454") + +;;; Diffs + + (bg-added "#003066") + (bg-added-faint "#001a4f") + (bg-added-refine "#0f4a77") + (bg-added-fringe "#006fff") + (fg-added "#c4d5ff") + (fg-added-intense "#8080ff") + + (bg-changed "#2f123f") + (bg-changed-faint "#1f022f") + (bg-changed-refine "#3f325f") + (bg-changed-fringe "#7f55a0") + (fg-changed "#e3cfff") + (fg-changed-intense "#cf9fe2") + + (bg-removed "#3d3d00") + (bg-removed-faint "#281f00") + (bg-removed-refine "#555500") + (bg-removed-fringe "#d0c03f") + (fg-removed "#d4d48f") + (fg-removed-intense "#d0b05f") + + (bg-diff-context "#1a1a1a") + +;;; Paren match + + (bg-paren-match "#2f7f9f") + (bg-paren-expression "#453040") + (underline-paren-match unspecified) + +;;; Mappings + +;;;; General mappings + + (fringe bg-dim) + (cursor yellow-intense) + + (keybind blue-cooler) + (name blue-cooler) + (identifier yellow-faint) + + (err yellow-warmer) + (warning yellow) + (info blue) + + (underline-err yellow-intense) + (underline-warning magenta-faint) + (underline-note cyan) + + (bg-prominent-err bg-yellow-intense) + (fg-prominent-err fg-main) + (bg-prominent-warning bg-magenta-intense) + (fg-prominent-warning fg-main) + (bg-prominent-note bg-cyan-intense) + (fg-prominent-note fg-main) + +;;;; Code mappings + + (builtin magenta-warmer) + (comment yellow-cooler) + (constant blue-cooler) + (docstring cyan-faint) + (docmarkup magenta-faint) + (fnname magenta) + (keyword magenta-cooler) + (preprocessor red-cooler) + (string blue-warmer) + (type cyan-cooler) + (variable cyan) + (rx-construct yellow-cooler) + (rx-backslash blue-cooler) + +;;;; Accent mappings + + (accent-0 blue-cooler) + (accent-1 yellow) + (accent-2 cyan-cooler) + (accent-3 magenta-warmer) + +;;;; Button mappings + + (fg-button-active fg-main) + (fg-button-inactive fg-dim) + (bg-button-active bg-active) + (bg-button-inactive bg-dim) + +;;;; Completion mappings + + (fg-completion-match-0 blue-cooler) + (fg-completion-match-1 yellow) + (fg-completion-match-2 cyan-cooler) + (fg-completion-match-3 magenta-warmer) + (bg-completion-match-0 unspecified) + (bg-completion-match-1 unspecified) + (bg-completion-match-2 unspecified) + (bg-completion-match-3 unspecified) + +;;;; Date mappings + + (date-common cyan) + (date-deadline yellow-warmer) + (date-event fg-alt) + (date-holiday yellow-warmer) + (date-holiday-other blue) + (date-now blue-faint) + (date-range fg-alt) + (date-scheduled yellow-cooler) + (date-weekday cyan) + (date-weekend yellow-faint) + +;;;; Line number mappings + + (fg-line-number-inactive fg-dim) + (fg-line-number-active fg-main) + (bg-line-number-inactive bg-dim) + (bg-line-number-active bg-active) + +;;;; Link mappings + + (fg-link blue-warmer) + (bg-link unspecified) + (underline-link blue-warmer) + + (fg-link-symbolic cyan) + (bg-link-symbolic unspecified) + (underline-link-symbolic cyan) + + (fg-link-visited yellow-faint) + (bg-link-visited unspecified) + (underline-link-visited yellow-faint) + +;;;; Mail mappings + + (mail-cite-0 blue-warmer) + (mail-cite-1 yellow-cooler) + (mail-cite-2 cyan-faint) + (mail-cite-3 yellow) + (mail-part blue) + (mail-recipient blue) + (mail-subject yellow-warmer) + (mail-other cyan-faint) + +;;;; Mark mappings + + (bg-mark-delete bg-yellow-subtle) + (fg-mark-delete yellow) + (bg-mark-select bg-cyan-subtle) + (fg-mark-select cyan) + (bg-mark-other bg-magenta-subtle) + (fg-mark-other magenta-warmer) + +;;;; Prompt mappings + + (fg-prompt blue) + (bg-prompt unspecified) + +;;;; Prose mappings + + (prose-block fg-dim) + (prose-code cyan-cooler) + (prose-done blue) + (prose-macro magenta-cooler) + (prose-metadata fg-dim) + (prose-metadata-value fg-alt) + (prose-table fg-alt) + (prose-tag magenta-faint) + (prose-todo yellow-warmer) + (prose-verbatim magenta-warmer) + +;;;; Rainbow mappings + + (rainbow-0 yellow-warmer) + (rainbow-1 blue) + (rainbow-2 yellow-cooler) + (rainbow-3 blue-warmer) + (rainbow-4 yellow) + (rainbow-5 cyan-warmer) + (rainbow-6 yellow-faint) + (rainbow-7 blue-faint) + (rainbow-8 magenta-faint) + +;;;; Space mappings + + (bg-space unspecified) + (fg-space border) + (bg-space-err bg-yellow-intense) + +;;;; Terminal mappings + + (bg-term-black "black") + (fg-term-black "black") + (bg-term-black-bright "gray35") + (fg-term-black-bright "gray35") + + (bg-term-red red) + (fg-term-red red) + (bg-term-red-bright red-warmer) + (fg-term-red-bright red-warmer) + + (bg-term-green green) + (fg-term-green green) + (bg-term-green-bright green-cooler) + (fg-term-green-bright green-cooler) + + (bg-term-yellow yellow) + (fg-term-yellow yellow) + (bg-term-yellow-bright yellow-warmer) + (fg-term-yellow-bright yellow-warmer) + + (bg-term-blue blue) + (fg-term-blue blue) + (bg-term-blue-bright blue-warmer) + (fg-term-blue-bright blue-warmer) + + (bg-term-magenta magenta) + (fg-term-magenta magenta) + (bg-term-magenta-bright magenta-cooler) + (fg-term-magenta-bright magenta-cooler) + + (bg-term-cyan cyan) + (fg-term-cyan cyan) + (bg-term-cyan-bright cyan-cooler) + (fg-term-cyan-bright cyan-cooler) + + (bg-term-white "gray65") + (fg-term-white "gray65") + (bg-term-white-bright "white") + (fg-term-white-bright "white") + +;;;; Heading mappings + + (fg-heading-0 cyan-cooler) + (fg-heading-1 fg-main) + (fg-heading-2 yellow-faint) + (fg-heading-3 blue-faint) + (fg-heading-4 magenta) + (fg-heading-5 green-faint) + (fg-heading-6 red-faint) + (fg-heading-7 cyan-faint) + (fg-heading-8 fg-dim) + + (bg-heading-0 unspecified) + (bg-heading-1 unspecified) + (bg-heading-2 unspecified) + (bg-heading-3 unspecified) + (bg-heading-4 unspecified) + (bg-heading-5 unspecified) + (bg-heading-6 unspecified) + (bg-heading-7 unspecified) + (bg-heading-8 unspecified) + + (overline-heading-0 unspecified) + (overline-heading-1 unspecified) + (overline-heading-2 unspecified) + (overline-heading-3 unspecified) + (overline-heading-4 unspecified) + (overline-heading-5 unspecified) + (overline-heading-6 unspecified) + (overline-heading-7 unspecified) + (overline-heading-8 unspecified)) + "The entire palette of the `modus-vivendi-deuteranopia' theme. + +Named colors have the form (COLOR-NAME HEX-VALUE) with the former +as a symbol and the latter as a string. + +Semantic color mappings have the form (MAPPING-NAME COLOR-NAME) +with both as symbols. The latter is a named color that already +exists in the palette and is associated with a HEX-VALUE.") + + (defcustom modus-vivendi-deuteranopia-palette-overrides nil + "Overrides for `modus-vivendi-deuteranopia-palette'. + +Mirror the elements of the aforementioned palette, overriding +their value. + +For overrides that are shared across all of the Modus themes, +refer to `modus-themes-common-palette-overrides'. + +Theme-specific overrides take precedence over shared overrides. +The idea of common overrides is to change semantic color +mappings, such as to make the cursor red. Wherea theme-specific +overrides can also be used to change the value of a named color, +such as what hexadecimal RGB value the red-warmer symbol +represents." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type '(repeat (list symbol (choice symbol string))) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Palette overrides")) + + (modus-themes-theme modus-vivendi-deuteranopia + modus-vivendi-deuteranopia-palette + modus-vivendi-deuteranopia-palette-overrides) + + (provide-theme 'modus-vivendi-deuteranopia)) + +;;; modus-vivendi-deuteranopia-theme.el ends here diff --git a/elpa/modus-themes-4.3.0/modus-vivendi-theme.el b/elpa/modus-themes-4.3.0/modus-vivendi-theme.el @@ -0,0 +1,484 @@ +;;; modus-vivendi-theme.el --- Elegant, highly legible theme with a black background -*- lexical-binding:t -*- + +;; Copyright (C) 2019-2023 Free Software Foundation, Inc. + +;; Author: Protesilaos Stavrou <info@protesilaos.com> +;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> +;; URL: https://git.sr.ht/~protesilaos/modus-themes +;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes + +;; 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: +;; +;; The Modus themes conform with the highest standard for +;; color-contrast accessibility between background and foreground +;; values (WCAG AAA). Please refer to the official Info manual for +;; further documentation (distributed with the themes, or available +;; at: <https://protesilaos.com/emacs/modus-themes>). + +;;; Code: + + + +(eval-and-compile + (unless (and (fboundp 'require-theme) + load-file-name + (equal (file-name-directory load-file-name) + (expand-file-name "themes/" data-directory)) + (require-theme 'modus-themes t)) + (require 'modus-themes)) + +;;;###theme-autoload + (deftheme modus-vivendi + "Elegant, highly legible theme with a black background. +Conforms with the highest legibility standard for color contrast +between background and foreground in any given piece of text, +which corresponds to a minimum contrast in relative luminance of +7:1 (WCAG AAA standard)." + :background-mode 'dark + :kind 'color-scheme + :family 'modus) + + (defconst modus-vivendi-palette + '( +;;; Basic values + + (bg-main "#000000") + (bg-dim "#1e1e1e") + (fg-main "#ffffff") + (fg-dim "#989898") + (fg-alt "#c6daff") + (bg-active "#535353") + (bg-inactive "#303030") + (border "#646464") + +;;; Common accent foregrounds + + (red "#ff5f59") + (red-warmer "#ff6b55") + (red-cooler "#ff7f9f") + (red-faint "#ff9580") + (red-intense "#ff5f5f") + (green "#44bc44") + (green-warmer "#70b900") + (green-cooler "#00c06f") + (green-faint "#88ca9f") + (green-intense "#44df44") + (yellow "#d0bc00") + (yellow-warmer "#fec43f") + (yellow-cooler "#dfaf7a") + (yellow-faint "#d2b580") + (yellow-intense "#efef00") + (blue "#2fafff") + (blue-warmer "#79a8ff") + (blue-cooler "#00bcff") + (blue-faint "#82b0ec") + (blue-intense "#338fff") + (magenta "#feacd0") + (magenta-warmer "#f78fe7") + (magenta-cooler "#b6a0ff") + (magenta-faint "#caa6df") + (magenta-intense "#ff66ff") + (cyan "#00d3d0") + (cyan-warmer "#4ae2f0") + (cyan-cooler "#6ae4b9") + (cyan-faint "#9ac8e0") + (cyan-intense "#00eff0") + +;;; Uncommon accent foregrounds + + (rust "#db7b5f") + (gold "#c0965b") + (olive "#9cbd6f") + (slate "#76afbf") + (indigo "#9099d9") + (maroon "#cf7fa7") + (pink "#d09dc0") + +;;; Common accent backgrounds + + (bg-red-intense "#9d1f1f") + (bg-green-intense "#2f822f") + (bg-yellow-intense "#7a6100") + (bg-blue-intense "#1640b0") + (bg-magenta-intense "#7030af") + (bg-cyan-intense "#2266ae") + + (bg-red-subtle "#620f2a") + (bg-green-subtle "#00422a") + (bg-yellow-subtle "#4a4000") + (bg-blue-subtle "#242679") + (bg-magenta-subtle "#552f5f") + (bg-cyan-subtle "#004065") + + (bg-red-nuanced "#2c0614") + (bg-green-nuanced "#001904") + (bg-yellow-nuanced "#221000") + (bg-blue-nuanced "#0f0e39") + (bg-magenta-nuanced "#230631") + (bg-cyan-nuanced "#041529") + +;;; Uncommon accent backgrounds + + (bg-ochre "#442c2f") + (bg-lavender "#38325c") + (bg-sage "#0f3d30") + +;;; Graphs + + (bg-graph-red-0 "#b52c2c") + (bg-graph-red-1 "#702020") + (bg-graph-green-0 "#0fed00") + (bg-graph-green-1 "#007800") + (bg-graph-yellow-0 "#f1e00a") + (bg-graph-yellow-1 "#b08940") + (bg-graph-blue-0 "#2fafef") + (bg-graph-blue-1 "#1f2f8f") + (bg-graph-magenta-0 "#bf94fe") + (bg-graph-magenta-1 "#5f509f") + (bg-graph-cyan-0 "#47dfea") + (bg-graph-cyan-1 "#00808f") + +;;; Special purpose + + (bg-completion "#2f447f") + (bg-hover "#45605e") + (bg-hover-secondary "#654a39") + (bg-hl-line "#2f3849") + (bg-region "#5a5a5a") + (fg-region "#ffffff") + + (bg-char-0 "#0050af") + (bg-char-1 "#7f1f7f") + (bg-char-2 "#625a00") + + (bg-mode-line-active "#505050") + (fg-mode-line-active "#ffffff") + (border-mode-line-active "#959595") + (bg-mode-line-inactive "#2d2d2d") + (fg-mode-line-inactive "#969696") + (border-mode-line-inactive "#606060") + + (modeline-err "#ffa9bf") + (modeline-warning "#dfcf43") + (modeline-info "#9fefff") + + (bg-tab-bar "#313131") + (bg-tab-current "#000000") + (bg-tab-other "#545454") + +;;; Diffs + + (bg-added "#00381f") + (bg-added-faint "#002910") + (bg-added-refine "#034f2f") + (bg-added-fringe "#237f3f") + (fg-added "#a0e0a0") + (fg-added-intense "#80e080") + + (bg-changed "#363300") + (bg-changed-faint "#2a1f00") + (bg-changed-refine "#4a4a00") + (bg-changed-fringe "#8a7a00") + (fg-changed "#efef80") + (fg-changed-intense "#c0b05f") + + (bg-removed "#4f1119") + (bg-removed-faint "#380a0f") + (bg-removed-refine "#781a1f") + (bg-removed-fringe "#b81a1f") + (fg-removed "#ffbfbf") + (fg-removed-intense "#ff9095") + + (bg-diff-context "#1a1a1a") + +;;; Paren match + + (bg-paren-match "#2f7f9f") + (bg-paren-expression "#453040") + (underline-paren-match unspecified) + +;;; Mappings + +;;;; General mappings + + (fringe bg-dim) + (cursor fg-main) + + (keybind blue-cooler) + (name magenta) + (identifier yellow-faint) + + (err red) + (warning yellow-warmer) + (info cyan-cooler) + + (underline-err red-intense) + (underline-warning yellow) + (underline-note cyan) + + (bg-prominent-err bg-red-intense) + (fg-prominent-err fg-main) + (bg-prominent-warning bg-yellow-intense) + (fg-prominent-warning fg-main) + (bg-prominent-note bg-cyan-intense) + (fg-prominent-note fg-main) + +;;;; Code mappings + + (builtin magenta-warmer) + (comment fg-dim) + (constant blue-cooler) + (docstring cyan-faint) + (docmarkup magenta-faint) + (fnname magenta) + (keyword magenta-cooler) + (preprocessor red-cooler) + (string blue-warmer) + (type cyan-cooler) + (variable cyan) + (rx-construct green-cooler) + (rx-backslash magenta) + +;;;; Accent mappings + + (accent-0 blue-cooler) + (accent-1 magenta-warmer) + (accent-2 cyan-cooler) + (accent-3 yellow) + +;;;; Button mappings + + (fg-button-active fg-main) + (fg-button-inactive fg-dim) + (bg-button-active bg-active) + (bg-button-inactive bg-dim) + +;;;; Completion mappings + + (fg-completion-match-0 blue-cooler) + (fg-completion-match-1 magenta-warmer) + (fg-completion-match-2 cyan-cooler) + (fg-completion-match-3 yellow) + (bg-completion-match-0 unspecified) + (bg-completion-match-1 unspecified) + (bg-completion-match-2 unspecified) + (bg-completion-match-3 unspecified) + +;;;; Date mappings + + (date-common cyan) + (date-deadline red) + (date-event fg-alt) + (date-holiday red-cooler) + (date-holiday-other blue) + (date-now fg-main) + (date-range fg-alt) + (date-scheduled yellow-warmer) + (date-weekday cyan) + (date-weekend red-faint) + +;;;; Line number mappings + + (fg-line-number-inactive fg-dim) + (fg-line-number-active fg-main) + (bg-line-number-inactive bg-dim) + (bg-line-number-active bg-active) + +;;;; Link mappings + + (fg-link blue-warmer) + (bg-link unspecified) + (underline-link blue-warmer) + + (fg-link-symbolic cyan) + (bg-link-symbolic unspecified) + (underline-link-symbolic cyan) + + (fg-link-visited magenta) + (bg-link-visited unspecified) + (underline-link-visited magenta) + +;;;; Mail mappings + + (mail-cite-0 blue-warmer) + (mail-cite-1 yellow-cooler) + (mail-cite-2 cyan-cooler) + (mail-cite-3 red-cooler) + (mail-part blue) + (mail-recipient magenta-cooler) + (mail-subject magenta-warmer) + (mail-other magenta-faint) + +;;;; Mark mappings + + (bg-mark-delete bg-red-subtle) + (fg-mark-delete red-cooler) + (bg-mark-select bg-cyan-subtle) + (fg-mark-select cyan) + (bg-mark-other bg-yellow-subtle) + (fg-mark-other yellow) + +;;;; Prompt mappings + + (fg-prompt cyan-cooler) + (bg-prompt unspecified) + +;;;; Prose mappings + + (prose-block fg-dim) + (prose-code cyan-cooler) + (prose-done green) + (prose-macro magenta-cooler) + (prose-metadata fg-dim) + (prose-metadata-value fg-alt) + (prose-table fg-alt) + (prose-tag magenta-faint) + (prose-todo red) + (prose-verbatim magenta-warmer) + +;;;; Rainbow mappings + + (rainbow-0 fg-main) + (rainbow-1 magenta-intense) + (rainbow-2 cyan-intense) + (rainbow-3 red-warmer) + (rainbow-4 yellow-intense) + (rainbow-5 magenta-cooler) + (rainbow-6 green-intense) + (rainbow-7 blue-warmer) + (rainbow-8 magenta-warmer) + +;;;; Space mappings + + (bg-space unspecified) + (fg-space border) + (bg-space-err bg-red-intense) + +;;;; Terminal mappings + + (bg-term-black "black") + (fg-term-black "black") + (bg-term-black-bright "gray35") + (fg-term-black-bright "gray35") + + (bg-term-red red) + (fg-term-red red) + (bg-term-red-bright red-warmer) + (fg-term-red-bright red-warmer) + + (bg-term-green green) + (fg-term-green green) + (bg-term-green-bright green-cooler) + (fg-term-green-bright green-cooler) + + (bg-term-yellow yellow) + (fg-term-yellow yellow) + (bg-term-yellow-bright yellow-warmer) + (fg-term-yellow-bright yellow-warmer) + + (bg-term-blue blue) + (fg-term-blue blue) + (bg-term-blue-bright blue-warmer) + (fg-term-blue-bright blue-warmer) + + (bg-term-magenta magenta) + (fg-term-magenta magenta) + (bg-term-magenta-bright magenta-cooler) + (fg-term-magenta-bright magenta-cooler) + + (bg-term-cyan cyan) + (fg-term-cyan cyan) + (bg-term-cyan-bright cyan-cooler) + (fg-term-cyan-bright cyan-cooler) + + (bg-term-white "gray65") + (fg-term-white "gray65") + (bg-term-white-bright "white") + (fg-term-white-bright "white") + +;;;; Heading mappings + + (fg-heading-0 cyan-cooler) + (fg-heading-1 fg-main) + (fg-heading-2 yellow-faint) + (fg-heading-3 blue-faint) + (fg-heading-4 magenta) + (fg-heading-5 green-faint) + (fg-heading-6 red-faint) + (fg-heading-7 cyan-faint) + (fg-heading-8 fg-dim) + + (bg-heading-0 unspecified) + (bg-heading-1 unspecified) + (bg-heading-2 unspecified) + (bg-heading-3 unspecified) + (bg-heading-4 unspecified) + (bg-heading-5 unspecified) + (bg-heading-6 unspecified) + (bg-heading-7 unspecified) + (bg-heading-8 unspecified) + + (overline-heading-0 unspecified) + (overline-heading-1 unspecified) + (overline-heading-2 unspecified) + (overline-heading-3 unspecified) + (overline-heading-4 unspecified) + (overline-heading-5 unspecified) + (overline-heading-6 unspecified) + (overline-heading-7 unspecified) + (overline-heading-8 unspecified)) + "The entire palette of the `modus-vivendi' theme. + +Named colors have the form (COLOR-NAME HEX-VALUE) with the former +as a symbol and the latter as a string. + +Semantic color mappings have the form (MAPPING-NAME COLOR-NAME) +with both as symbols. The latter is a named color that already +exists in the palette and is associated with a HEX-VALUE.") + + + (defcustom modus-vivendi-palette-overrides nil + "Overrides for `modus-vivendi-palette'. + +Mirror the elements of the aforementioned palette, overriding +their value. + +For overrides that are shared across all of the Modus themes, +refer to `modus-themes-common-palette-overrides'. + +Theme-specific overrides take precedence over shared overrides. +The idea of common overrides is to change semantic color +mappings, such as to make the cursor red. Wherea theme-specific +overrides can also be used to change the value of a named color, +such as what hexadecimal RGB value the red-warmer symbol +represents." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type '(repeat (list symbol (choice symbol string))) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Palette overrides")) + + (modus-themes-theme modus-vivendi + modus-vivendi-palette + modus-vivendi-palette-overrides) + + (provide-theme 'modus-vivendi)) + +;;; modus-vivendi-theme.el ends here diff --git a/elpa/modus-themes-4.3.0/modus-vivendi-tinted-theme.el b/elpa/modus-themes-4.3.0/modus-vivendi-tinted-theme.el @@ -0,0 +1,483 @@ +;;; modus-vivendi-tinted-theme.el --- Elegant, highly legible theme with a night sky background -*- lexical-binding:t -*- + +;; Copyright (C) 2019-2023 Free Software Foundation, Inc. + +;; Author: Protesilaos Stavrou <info@protesilaos.com> +;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> +;; URL: https://git.sr.ht/~protesilaos/modus-themes +;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes + +;; 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: +;; +;; The Modus themes conform with the highest standard for +;; color-contrast accessibility between background and foreground +;; values (WCAG AAA). Please refer to the official Info manual for +;; further documentation (distributed with the themes, or available +;; at: <https://protesilaos.com/emacs/modus-themes>). + +;;; Code: + + + +(eval-and-compile + (unless (and (fboundp 'require-theme) + load-file-name + (equal (file-name-directory load-file-name) + (expand-file-name "themes/" data-directory)) + (require-theme 'modus-themes t)) + (require 'modus-themes)) + +;;;###theme-autoload + (deftheme modus-vivendi-tinted + "Elegant, highly legible theme with a night sky background. +Conforms with the highest legibility standard for color contrast +between background and foreground in any given piece of text, +which corresponds to a minimum contrast in relative luminance of +7:1 (WCAG AAA standard)." + :background-mode 'dark + :kind 'color-scheme + :family 'modus) + + (defconst modus-vivendi-tinted-palette + '( +;;; Basic values + + (bg-main "#0d0e1c") + (bg-dim "#1d2235") + (fg-main "#ffffff") + (fg-dim "#989898") + (fg-alt "#c6daff") + (bg-active "#4a4f69") + (bg-inactive "#2b3045") + (border "#61647a") + +;;; Common accent foregrounds + + (red "#ff5f59") + (red-warmer "#ff6b55") + (red-cooler "#ff7f9f") + (red-faint "#ff9f80") + (red-intense "#ff5f5f") + (green "#44bc44") + (green-warmer "#70b900") + (green-cooler "#00c06f") + (green-faint "#88ca9f") + (green-intense "#44df44") + (yellow "#d0bc00") + (yellow-warmer "#fec43f") + (yellow-cooler "#dfaf7a") + (yellow-faint "#d2b580") + (yellow-intense "#efef00") + (blue "#2fafff") + (blue-warmer "#79a8ff") + (blue-cooler "#00bcff") + (blue-faint "#82b0ec") + (blue-intense "#338fff") + (magenta "#feacd0") + (magenta-warmer "#f78fe7") + (magenta-cooler "#b6a0ff") + (magenta-faint "#caa6df") + (magenta-intense "#ff66ff") + (cyan "#00d3d0") + (cyan-warmer "#4ae2f0") + (cyan-cooler "#6ae4b9") + (cyan-faint "#9ac8e0") + (cyan-intense "#00eff0") + +;;; Uncommon accent foregrounds + + (rust "#db7b5f") + (gold "#c0965b") + (olive "#9cbd6f") + (slate "#76afbf") + (indigo "#9099d9") + (maroon "#cf7fa7") + (pink "#d09dc0") + +;;; Common accent backgrounds + + (bg-red-intense "#9d1f1f") + (bg-green-intense "#2f822f") + (bg-yellow-intense "#7a6100") + (bg-blue-intense "#1640b0") + (bg-magenta-intense "#7030af") + (bg-cyan-intense "#2266ae") + + (bg-red-subtle "#620f2a") + (bg-green-subtle "#00422a") + (bg-yellow-subtle "#4a4000") + (bg-blue-subtle "#242679") + (bg-magenta-subtle "#552f5f") + (bg-cyan-subtle "#004065") + + (bg-red-nuanced "#350f14") + (bg-green-nuanced "#002718") + (bg-yellow-nuanced "#2c1f00") + (bg-blue-nuanced "#131c4d") + (bg-magenta-nuanced "#2f133f") + (bg-cyan-nuanced "#04253f") + +;;; Graphs + + (bg-graph-red-0 "#b52c2c") + (bg-graph-red-1 "#702020") + (bg-graph-green-0 "#0fed00") + (bg-graph-green-1 "#007800") + (bg-graph-yellow-0 "#f1e00a") + (bg-graph-yellow-1 "#b08940") + (bg-graph-blue-0 "#2fafef") + (bg-graph-blue-1 "#1f2f8f") + (bg-graph-magenta-0 "#bf94fe") + (bg-graph-magenta-1 "#5f509f") + (bg-graph-cyan-0 "#47dfea") + (bg-graph-cyan-1 "#00808f") + +;;; Special purpose + + (bg-completion "#483d8a") + (bg-hover "#45605e") + (bg-hover-secondary "#654a39") + (bg-hl-line "#303a6f") + (bg-region "#555a66") + (fg-region "#ffffff") + + (bg-char-0 "#0050af") + (bg-char-1 "#7f1f7f") + (bg-char-2 "#625a00") + + (bg-mode-line-active "#484d67") + (fg-mode-line-active "#ffffff") + (border-mode-line-active "#979797") + (bg-mode-line-inactive "#292d48") + (fg-mode-line-inactive "#969696") + (border-mode-line-inactive "#606270") + + (modeline-err "#ffa9bf") + (modeline-warning "#dfcf43") + (modeline-info "#9fefff") + + (bg-tab-bar "#2c3045") + (bg-tab-current "#0d0e1c") + (bg-tab-other "#4a4f6a") + +;;; Diffs + + (bg-added "#003a2f") + (bg-added-faint "#002922") + (bg-added-refine "#035542") + (bg-added-fringe "#23884f") + (fg-added "#a0e0a0") + (fg-added-intense "#80e080") + + (bg-changed "#363300") + (bg-changed-faint "#2a1f00") + (bg-changed-refine "#4a4a00") + (bg-changed-fringe "#8f7a30") + (fg-changed "#efef80") + (fg-changed-intense "#c0b05f") + + (bg-removed "#4f1127") + (bg-removed-faint "#380a19") + (bg-removed-refine "#781a3a") + (bg-removed-fringe "#b81a26") + (fg-removed "#ffbfbf") + (fg-removed-intense "#ff9095") + + (bg-diff-context "#1a1f30") + +;;; Uncommon accent backgrounds + + (bg-ochre "#442c2f") + (bg-lavender "#38325c") + (bg-sage "#0f3d30") + +;;; Paren match + + (bg-paren-match "#2f7f9f") + (bg-paren-expression "#453040") + (underline-paren-match unspecified) + +;;; Mappings + +;;;; General mappings + + (fringe bg-dim) + (cursor magenta-warmer) + + (keybind blue-cooler) + (name magenta) + (identifier yellow-faint) + + (err red) + (warning yellow-warmer) + (info cyan-cooler) + + (underline-err red-intense) + (underline-warning yellow) + (underline-note cyan) + + (bg-prominent-err bg-red-intense) + (fg-prominent-err fg-main) + (bg-prominent-warning bg-yellow-intense) + (fg-prominent-warning fg-main) + (bg-prominent-note bg-cyan-intense) + (fg-prominent-note fg-main) + +;;;; Code mappings + + (builtin magenta-warmer) + (comment red-faint) + (constant blue-cooler) + (docstring cyan-faint) + (docmarkup magenta-faint) + (fnname magenta) + (keyword magenta-cooler) + (preprocessor red-cooler) + (string blue-warmer) + (type cyan-cooler) + (variable cyan) + (rx-construct green-cooler) + (rx-backslash magenta) + +;;;; Accent mappings + + (accent-0 blue-cooler) + (accent-1 magenta-warmer) + (accent-2 cyan-cooler) + (accent-3 yellow) + +;;;; Button mappings + + (fg-button-active fg-main) + (fg-button-inactive fg-dim) + (bg-button-active bg-active) + (bg-button-inactive bg-dim) + +;;;; Completion mappings + + (fg-completion-match-0 blue-cooler) + (fg-completion-match-1 magenta-warmer) + (fg-completion-match-2 cyan-cooler) + (fg-completion-match-3 yellow) + (bg-completion-match-0 unspecified) + (bg-completion-match-1 unspecified) + (bg-completion-match-2 unspecified) + (bg-completion-match-3 unspecified) + +;;;; Date mappings + + (date-common cyan) + (date-deadline red) + (date-event fg-alt) + (date-holiday red-cooler) + (date-holiday-other blue) + (date-now fg-main) + (date-range fg-alt) + (date-scheduled yellow-warmer) + (date-weekday cyan) + (date-weekend red-faint) + +;;;; Line number mappings + + (fg-line-number-inactive fg-dim) + (fg-line-number-active fg-main) + (bg-line-number-inactive bg-dim) + (bg-line-number-active bg-active) + +;;;; Link mappings + + (fg-link blue-warmer) + (bg-link unspecified) + (underline-link blue-warmer) + + (fg-link-symbolic cyan) + (bg-link-symbolic unspecified) + (underline-link-symbolic cyan) + + (fg-link-visited magenta) + (bg-link-visited unspecified) + (underline-link-visited magenta) + +;;;; Mail mappings + + (mail-cite-0 blue-warmer) + (mail-cite-1 yellow-cooler) + (mail-cite-2 cyan-cooler) + (mail-cite-3 red-cooler) + (mail-part blue) + (mail-recipient magenta-cooler) + (mail-subject magenta-warmer) + (mail-other magenta-faint) + +;;;; Mark mappings + + (bg-mark-delete bg-red-subtle) + (fg-mark-delete red-cooler) + (bg-mark-select bg-cyan-subtle) + (fg-mark-select cyan) + (bg-mark-other bg-yellow-subtle) + (fg-mark-other yellow) + +;;;; Prompt mappings + + (fg-prompt cyan-cooler) + (bg-prompt unspecified) + (bg-space-err bg-red-intense) + +;;;; Prose mappings + + (prose-block fg-dim) + (prose-code cyan-cooler) + (prose-done green) + (prose-macro magenta-cooler) + (prose-metadata fg-dim) + (prose-metadata-value fg-alt) + (prose-table fg-alt) + (prose-tag magenta-faint) + (prose-todo red) + (prose-verbatim magenta-warmer) + +;;;; Rainbow mappings + + (rainbow-0 fg-main) + (rainbow-1 magenta-intense) + (rainbow-2 cyan-intense) + (rainbow-3 red-warmer) + (rainbow-4 yellow-intense) + (rainbow-5 magenta-cooler) + (rainbow-6 green-intense) + (rainbow-7 blue-warmer) + (rainbow-8 magenta-warmer) + +;;;; Space mappings + + (bg-space unspecified) + (fg-space border) + +;;;; Terminal mappings + + (bg-term-black "black") + (fg-term-black "black") + (bg-term-black-bright "gray35") + (fg-term-black-bright "gray35") + + (bg-term-red red) + (fg-term-red red) + (bg-term-red-bright red-warmer) + (fg-term-red-bright red-warmer) + + (bg-term-green green) + (fg-term-green green) + (bg-term-green-bright green-cooler) + (fg-term-green-bright green-cooler) + + (bg-term-yellow yellow) + (fg-term-yellow yellow) + (bg-term-yellow-bright yellow-warmer) + (fg-term-yellow-bright yellow-warmer) + + (bg-term-blue blue) + (fg-term-blue blue) + (bg-term-blue-bright blue-warmer) + (fg-term-blue-bright blue-warmer) + + (bg-term-magenta magenta) + (fg-term-magenta magenta) + (bg-term-magenta-bright magenta-cooler) + (fg-term-magenta-bright magenta-cooler) + + (bg-term-cyan cyan) + (fg-term-cyan cyan) + (bg-term-cyan-bright cyan-cooler) + (fg-term-cyan-bright cyan-cooler) + + (bg-term-white "gray65") + (fg-term-white "gray65") + (bg-term-white-bright "white") + (fg-term-white-bright "white") + +;;;; Heading mappings + + (fg-heading-0 cyan-cooler) + (fg-heading-1 fg-main) + (fg-heading-2 yellow-faint) + (fg-heading-3 blue-faint) + (fg-heading-4 magenta) + (fg-heading-5 green-faint) + (fg-heading-6 red-faint) + (fg-heading-7 cyan-faint) + (fg-heading-8 fg-dim) + + (bg-heading-0 unspecified) + (bg-heading-1 unspecified) + (bg-heading-2 unspecified) + (bg-heading-3 unspecified) + (bg-heading-4 unspecified) + (bg-heading-5 unspecified) + (bg-heading-6 unspecified) + (bg-heading-7 unspecified) + (bg-heading-8 unspecified) + + (overline-heading-0 unspecified) + (overline-heading-1 unspecified) + (overline-heading-2 unspecified) + (overline-heading-3 unspecified) + (overline-heading-4 unspecified) + (overline-heading-5 unspecified) + (overline-heading-6 unspecified) + (overline-heading-7 unspecified) + (overline-heading-8 unspecified)) + "The entire palette of the `modus-vivendi-tinted' theme. + +Named colors have the form (COLOR-NAME HEX-VALUE) with the former +as a symbol and the latter as a string. + +Semantic color mappings have the form (MAPPING-NAME COLOR-NAME) +with both as symbols. The latter is a named color that already +exists in the palette and is associated with a HEX-VALUE.") + + (defcustom modus-vivendi-tinted-palette-overrides nil + "Overrides for `modus-vivendi-tinted-palette'. + +Mirror the elements of the aforementioned palette, overriding +their value. + +For overrides that are shared across all of the Modus themes, +refer to `modus-themes-common-palette-overrides'. + +Theme-specific overrides take precedence over shared overrides. +The idea of common overrides is to change semantic color +mappings, such as to make the cursor red. Wherea theme-specific +overrides can also be used to change the value of a named color, +such as what hexadecimal RGB value the red-warmer symbol +represents." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type '(repeat (list symbol (choice symbol string))) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Palette overrides")) + + (modus-themes-theme modus-vivendi-tinted + modus-vivendi-tinted-palette + modus-vivendi-tinted-palette-overrides) + + (provide-theme 'modus-vivendi-tinted)) + +;;; modus-vivendi-tinted-theme.el ends here diff --git a/elpa/modus-themes-4.3.0/modus-vivendi-tritanopia-theme.el b/elpa/modus-themes-4.3.0/modus-vivendi-tritanopia-theme.el @@ -0,0 +1,486 @@ +;;; modus-vivendi-tritanopia-theme.el --- Tritanopia-optimized theme with a black background -*- lexical-binding:t -*- + +;; Copyright (C) 2019-2023 Free Software Foundation, Inc. + +;; Author: Protesilaos Stavrou <info@protesilaos.com> +;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht> +;; URL: https://git.sr.ht/~protesilaos/modus-themes +;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes +;; Keywords: faces, theme, accessibility + +;; 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: +;; +;; The Modus themes conform with the highest standard for +;; color-contrast accessibility between background and foreground +;; values (WCAG AAA). Please refer to the official Info manual for +;; further documentation (distributed with the themes, or available +;; at: <https://protesilaos.com/emacs/modus-themes>). + +;;; Code: + + + +(eval-and-compile + (unless (and (fboundp 'require-theme) + load-file-name + (equal (file-name-directory load-file-name) + (expand-file-name "themes/" data-directory)) + (require-theme 'modus-themes t)) + (require 'modus-themes)) + +;;;###theme-autoload + (deftheme modus-vivendi-tritanopia + "Tritanopia-optimized theme with a black background. +This variant is optimized for users with blue-yellow color +deficiency (tritanopia). It conforms with the highest +legibility standard for color contrast between background and +foreground in any given piece of text, which corresponds to a +minimum contrast in relative luminance of 7:1 (WCAG AAA +standard)." + :background-mode 'dark + :kind 'color-scheme + :family 'modus) + + (defconst modus-vivendi-tritanopia-palette + '( +;;; Basic values + + (bg-main "#000000") + (bg-dim "#1e1e1e") + (fg-main "#ffffff") + (fg-dim "#989898") + (fg-alt "#c6daff") + (bg-active "#535353") + (bg-inactive "#303030") + (border "#646464") + +;;; Common accent foregrounds + + (red "#ff5f59") + (red-warmer "#ff6740") + (red-cooler "#ff6f9f") + (red-faint "#ff9070") + (red-intense "#ff5f5f") + (green "#44bc44") + (green-warmer "#70b900") + (green-cooler "#00c06f") + (green-faint "#88ca9f") + (green-intense "#44df44") + (yellow "#cabf00") + (yellow-warmer "#ffa00f") + (yellow-cooler "#d8af7a") + (yellow-faint "#d2b580") + (yellow-intense "#efef00") + (blue "#2fafff") + (blue-warmer "#79a8ff") + (blue-cooler "#00bcff") + (blue-faint "#82b0ec") + (blue-intense "#338fff") + (magenta "#feacd0") + (magenta-warmer "#f78fe7") + (magenta-cooler "#b6a0ff") + (magenta-faint "#caa6df") + (magenta-intense "#ef7fff") + (cyan "#00d3d0") + (cyan-warmer "#4ae2ff") + (cyan-cooler "#6ae4b9") + (cyan-faint "#7fdbdf") + (cyan-intense "#00eff0") + +;;; Uncommon accent foregrounds + + (rust "#db7b5f") + (gold "#c0965b") + (olive "#9cbd6f") + (slate "#76afbf") + (indigo "#9099d9") + (maroon "#cf7fa7") + (pink "#d09dc0") + +;;; Common accent backgrounds + + (bg-red-intense "#9d1f1f") + (bg-green-intense "#2f822f") + (bg-yellow-intense "#7a6100") + (bg-blue-intense "#1640b0") + (bg-magenta-intense "#7030af") + (bg-cyan-intense "#2266ae") + + (bg-red-subtle "#620f2a") + (bg-green-subtle "#00422a") + (bg-yellow-subtle "#4a4000") + (bg-blue-subtle "#242679") + (bg-magenta-subtle "#552f5f") + (bg-cyan-subtle "#004065") + + (bg-red-nuanced "#2c0614") + (bg-green-nuanced "#001904") + (bg-yellow-nuanced "#221000") + (bg-blue-nuanced "#0f0e39") + (bg-magenta-nuanced "#230631") + (bg-cyan-nuanced "#041529") + +;;; Uncommon accent backgrounds + + (bg-ochre "#442c2f") + (bg-lavender "#38325c") + (bg-sage "#0f3d30") + +;;; Graphs + + (bg-graph-red-0 "#b52c2c") + (bg-graph-red-1 "#702020") + (bg-graph-green-0 "#afd1c0") + (bg-graph-green-1 "#607a8f") + (bg-graph-yellow-0 "#facfd6") + (bg-graph-yellow-1 "#b57b85") + (bg-graph-blue-0 "#4f9fdf") + (bg-graph-blue-1 "#004559") + (bg-graph-magenta-0 "#b6427f") + (bg-graph-magenta-1 "#7f506f") + (bg-graph-cyan-0 "#57dfea") + (bg-graph-cyan-1 "#00808f") + +;;; Special purpose + + (bg-completion "#004253") + (bg-hover "#8e3e3b") + (bg-hover-secondary "#00405f") + (bg-hl-line "#2f3849") + (bg-region "#5a5a5a") + (fg-region "#ffffff") + + (bg-char-0 "#922a00") + (bg-char-1 "#00709f") + (bg-char-2 "#5f3faf") + + (bg-mode-line-active "#003c52") + (fg-mode-line-active "#f0f0f0") + (border-mode-line-active "#5f8fb4") + (bg-mode-line-inactive "#2d2d2d") + (fg-mode-line-inactive "#969696") + (border-mode-line-inactive "#606060") + + (modeline-err "#ff7fbf") + (modeline-warning "#df9f93") + (modeline-info "#4fcfef") + + (bg-tab-bar "#313131") + (bg-tab-current "#000000") + (bg-tab-other "#545454") + +;;; Diffs + + (bg-added "#004254") + (bg-added-faint "#003042") + (bg-added-refine "#004f7f") + (bg-added-fringe "#008fcf") + (fg-added "#9fdfdf") + (fg-added-intense "#50c0ef") + + (bg-changed "#2f123f") + (bg-changed-faint "#1f022f") + (bg-changed-refine "#3f325f") + (bg-changed-fringe "#7f55a0") + (fg-changed "#e3cfff") + (fg-changed-intense "#cf9fe2") + + (bg-removed "#4f1119") + (bg-removed-faint "#380a0f") + (bg-removed-refine "#781a1f") + (bg-removed-fringe "#b81a1f") + (fg-removed "#ffbfbf") + (fg-removed-intense "#ff9095") + + (bg-diff-context "#1a1a1a") + +;;; Paren match + + (bg-paren-match "#2f7f9f") + (bg-paren-expression "#453040") + (underline-paren-match unspecified) + +;;; Mappings + +;;;; General mappings + + (fringe bg-dim) + (cursor red-intense) + + (keybind red) + (name red-cooler) + (identifier red-faint) + + (err red-warmer) + (warning magenta) + (info cyan) + + (underline-err red-intense) + (underline-warning magenta-intense) + (underline-note cyan-intense) + + (bg-prominent-err bg-red-intense) + (fg-prominent-err fg-main) + (bg-prominent-warning bg-magenta-intense) + (fg-prominent-warning fg-main) + (bg-prominent-note bg-cyan-intense) + (fg-prominent-note fg-main) + +;;;; Code mappings + + (builtin magenta) + (comment red-faint) + (constant green-faint) + (docstring fg-alt) + (docmarkup magenta-faint) + (fnname cyan-warmer) + (keyword red-cooler) + (preprocessor red-warmer) + (string cyan) + (type blue-warmer) + (variable cyan-cooler) + (rx-construct red) + (rx-backslash magenta) + +;;;; Accent mappings + + (accent-0 cyan) + (accent-1 red-warmer) + (accent-2 cyan-cooler) + (accent-3 magenta) + +;;;; Button mappings + + (fg-button-active fg-main) + (fg-button-inactive fg-dim) + (bg-button-active bg-active) + (bg-button-inactive bg-dim) + +;;;; Completion mappings + + (fg-completion-match-0 cyan) + (fg-completion-match-1 red-warmer) + (fg-completion-match-2 magenta) + (fg-completion-match-3 cyan-cooler) + (bg-completion-match-0 unspecified) + (bg-completion-match-1 unspecified) + (bg-completion-match-2 unspecified) + (bg-completion-match-3 unspecified) + +;;;; Date mappings + + (date-common cyan-cooler) + (date-deadline red) + (date-event fg-alt) + (date-holiday red-intense) + (date-holiday-other cyan-warmer) + (date-now fg-main) + (date-range fg-alt) + (date-scheduled magenta) + (date-weekday cyan) + (date-weekend red-faint) + +;;;; Line number mappings + + (fg-line-number-inactive fg-dim) + (fg-line-number-active fg-main) + (bg-line-number-inactive bg-dim) + (bg-line-number-active bg-active) + +;;;; Link mappings + + (fg-link cyan) + (bg-link unspecified) + (underline-link cyan) + + (fg-link-symbolic cyan-cooler) + (bg-link-symbolic unspecified) + (underline-link-symbolic cyan-cooler) + + (fg-link-visited magenta) + (bg-link-visited unspecified) + (underline-link-visited magenta) + +;;;; Mail mappings + + (mail-cite-0 cyan-faint) + (mail-cite-1 red-faint) + (mail-cite-2 magenta-warmer) + (mail-cite-3 cyan-warmer) + (mail-part cyan-cooler) + (mail-recipient cyan) + (mail-subject red-cooler) + (mail-other cyan) + +;;;; Mark mappings + + (bg-mark-delete bg-red-subtle) + (fg-mark-delete red) + (bg-mark-select bg-cyan-subtle) + (fg-mark-select cyan) + (bg-mark-other bg-magenta-subtle) + (fg-mark-other magenta-warmer) + +;;;; Prompt mappings + + (fg-prompt cyan-cooler) + (bg-prompt unspecified) + +;;;; Prose mappings + + (prose-block fg-dim) + (prose-code cyan) + (prose-done cyan) + (prose-macro red-warmer) + (prose-metadata fg-dim) + (prose-metadata-value fg-alt) + (prose-table fg-alt) + (prose-tag fg-alt) + (prose-todo red) + (prose-verbatim magenta-warmer) + +;;;; Rainbow mappings + + (rainbow-0 cyan) + (rainbow-1 red) + (rainbow-2 cyan-warmer) + (rainbow-3 red-cooler) + (rainbow-4 cyan-cooler) + (rainbow-5 magenta) + (rainbow-6 cyan-faint) + (rainbow-7 magenta-faint) + (rainbow-8 red-faint) + +;;;; Space mappings + + (bg-space unspecified) + (fg-space border) + (bg-space-err bg-red-intense) + +;;;; Terminal mappings + + (bg-term-black "black") + (fg-term-black "black") + (bg-term-black-bright "gray35") + (fg-term-black-bright "gray35") + + (bg-term-red red) + (fg-term-red red) + (bg-term-red-bright red-warmer) + (fg-term-red-bright red-warmer) + + (bg-term-green green) + (fg-term-green green) + (bg-term-green-bright green-cooler) + (fg-term-green-bright green-cooler) + + (bg-term-yellow yellow) + (fg-term-yellow yellow) + (bg-term-yellow-bright yellow-warmer) + (fg-term-yellow-bright yellow-warmer) + + (bg-term-blue blue) + (fg-term-blue blue) + (bg-term-blue-bright blue-warmer) + (fg-term-blue-bright blue-warmer) + + (bg-term-magenta magenta) + (fg-term-magenta magenta) + (bg-term-magenta-bright magenta-cooler) + (fg-term-magenta-bright magenta-cooler) + + (bg-term-cyan cyan) + (fg-term-cyan cyan) + (bg-term-cyan-bright cyan-cooler) + (fg-term-cyan-bright cyan-cooler) + + (bg-term-white "gray65") + (fg-term-white "gray65") + (bg-term-white-bright "white") + (fg-term-white-bright "white") + +;;;; Heading mappings + + (fg-heading-0 cyan-cooler) + (fg-heading-1 fg-main) + (fg-heading-2 red-faint) + (fg-heading-3 cyan-faint) + (fg-heading-4 magenta) + (fg-heading-5 green-faint) + (fg-heading-6 magenta-faint) + (fg-heading-7 cyan-faint) + (fg-heading-8 fg-dim) + + (bg-heading-0 unspecified) + (bg-heading-1 unspecified) + (bg-heading-2 unspecified) + (bg-heading-3 unspecified) + (bg-heading-4 unspecified) + (bg-heading-5 unspecified) + (bg-heading-6 unspecified) + (bg-heading-7 unspecified) + (bg-heading-8 unspecified) + + (overline-heading-0 unspecified) + (overline-heading-1 unspecified) + (overline-heading-2 unspecified) + (overline-heading-3 unspecified) + (overline-heading-4 unspecified) + (overline-heading-5 unspecified) + (overline-heading-6 unspecified) + (overline-heading-7 unspecified) + (overline-heading-8 unspecified)) + "The entire palette of the `modus-vivendi-tritanopia' theme. + +Named colors have the form (COLOR-NAME HEX-VALUE) with the former +as a symbol and the latter as a string. + +Semantic color mappings have the form (MAPPING-NAME COLOR-NAME) +with both as symbols. The latter is a named color that already +exists in the palette and is associated with a HEX-VALUE.") + + (defcustom modus-vivendi-tritanopia-palette-overrides nil + "Overrides for `modus-vivendi-tritanopia-palette'. + +Mirror the elements of the aforementioned palette, overriding +their value. + +For overrides that are shared across all of the Modus themes, +refer to `modus-themes-common-palette-overrides'. + +Theme-specific overrides take precedence over shared overrides. +The idea of common overrides is to change semantic color +mappings, such as to make the cursor red. Wherea theme-specific +overrides can also be used to change the value of a named color, +such as what hexadecimal RGB value the red-warmer symbol +represents." + :group 'modus-themes + :package-version '(modus-themes . "4.0.0") + :version "30.1" + :type '(repeat (list symbol (choice symbol string))) + :set #'modus-themes--set-option + :initialize #'custom-initialize-default + :link '(info-link "(modus-themes) Palette overrides")) + + (modus-themes-theme modus-vivendi-tritanopia + modus-vivendi-tritanopia-palette + modus-vivendi-tritanopia-palette-overrides) + + (provide-theme 'modus-vivendi-tritanopia)) + +;;; modus-vivendi-tritanopia-theme.el ends here diff --git a/elpa/modus-themes-4.3.0/theme-loaddefs.el b/elpa/modus-themes-4.3.0/theme-loaddefs.el @@ -0,0 +1,63 @@ +;;; theme-loaddefs.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; Generated autoloads from modus-operandi-deuteranopia-theme.el + +(put 'modus-operandi-deuteranopia 'theme-properties (list :background-mode 'light :kind 'color-scheme :family 'modus)) + + +;;; Generated autoloads from modus-operandi-theme.el + +(put 'modus-operandi 'theme-properties (list :background-mode 'light :kind 'color-scheme :family 'modus)) + + +;;; Generated autoloads from modus-operandi-tinted-theme.el + +(put 'modus-operandi-tinted 'theme-properties (list :background-mode 'light :kind 'color-scheme :family 'modus)) + + +;;; Generated autoloads from modus-operandi-tritanopia-theme.el + +(put 'modus-operandi-tritanopia 'theme-properties (list :background-mode 'light :kind 'color-scheme :family 'modus)) + + +;;; Generated autoloads from modus-vivendi-deuteranopia-theme.el + +(put 'modus-vivendi-deuteranopia 'theme-properties (list :background-mode 'dark :kind 'color-scheme :family 'modus)) + + +;;; Generated autoloads from modus-vivendi-theme.el + +(put 'modus-vivendi 'theme-properties (list :background-mode 'dark :kind 'color-scheme :family 'modus)) + + +;;; Generated autoloads from modus-vivendi-tinted-theme.el + +(put 'modus-vivendi-tinted 'theme-properties (list :background-mode 'dark :kind 'color-scheme :family 'modus)) + + +;;; Generated autoloads from modus-vivendi-tritanopia-theme.el + +(put 'modus-vivendi-tritanopia 'theme-properties (list :background-mode 'dark :kind 'color-scheme :family 'modus)) + +;;; End of scraped data + +(provide 'theme-loaddefs) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; theme-loaddefs.el ends here diff --git a/init.el b/init.el @@ -313,6 +313,9 @@ '(corfu-quit-at-boundary t) '(create-lockfiles nil) '(cursor-type 'bar) + '(custom-enabled-themes '(modus-operandi)) + '(custom-safe-themes + '("3d94d6d1a1c23113a60c8496c9aed094dbc2695f219e8127bb168d17b1e6dab3" "4b026ac68a1aa4d1a91879b64f54c2490b4ecad8b64de5b1865bca0addd053d9" "58264887d7ab17702ef85bbd96e11bd7f613622ff9c63990be860b958c978f09" "611ef0918b8b413badb8055089b5499c1d4ac20f1861efba8f3bfcb36ad0a448" "15604b083d03519b0c2ed7b32da6d7b2dc2f6630bef62608def60cdcf9216184" "88cb0f9c0c11dbb4c26a628d35eb9239d1cf580cfd28e332e654e7f58b4e721b" "69f7e8101867cfac410e88140f8c51b4433b93680901bb0b52014144366a08c8" "21e3d55141186651571241c2ba3c665979d1e886f53b2e52411e9e96659132d4" default)) '(delete-old-versions t) '(delete-selection-mode t) '(denote-modules '(project xref ffap)) @@ -387,7 +390,7 @@ ("melpa" . "https://melpa.org/packages/"))) '(package-pinned-packages '((sly . "melpa"))) '(package-selected-packages - '(imenu-list diff-hl embark-consult embark all-the-icons-completion all-the-icons-ibuffer all-the-icons-dired sly-named-readtables sly-macrostep denote-refs denote-menu denote ox-epub ob-powershell powershell web-mode lexic editorconfig elfeed-tube-mpv elfeed-tube cider restclient-jq graphviz-dot-mode consult-eglot jq-mode ob-restclient restclient vterm deadgrep helpful pdf-tools paredit-menu paredit corfu sly eglot aggressive-indent project nov nhexl-mode elfeed magit yaml-mode json-mode lua-mode go-mode geiser-guile geiser org-contrib org ace-window expand-region consult marginalia uuidgen request diminish which-key)) + '(modus-themes imenu-list diff-hl embark-consult embark all-the-icons-completion all-the-icons-ibuffer all-the-icons-dired sly-named-readtables sly-macrostep denote-refs denote-menu denote ox-epub ob-powershell powershell web-mode lexic editorconfig elfeed-tube-mpv elfeed-tube cider restclient-jq graphviz-dot-mode consult-eglot jq-mode ob-restclient restclient vterm deadgrep helpful pdf-tools paredit-menu paredit corfu sly eglot aggressive-indent project nov nhexl-mode elfeed magit yaml-mode json-mode lua-mode go-mode geiser-guile geiser org-contrib org ace-window expand-region consult marginalia uuidgen request diminish which-key)) '(pcomplete-ignore-case t t) '(pixel-scroll-precision-mode t) '(read-buffer-completion-ignore-case t)