MELI-THEMES(5)
meli-themes π the manual, but make it cute
File Formats Manual Β· meli-themes(5)
β¨ NAME β¨
meli-themes β themes for the meli(1) terminal e-mail client π
πΈ SYNOPSIS πΈ
ok so meli ships with two themes out of the box, bestie: dark (that's the default, she's the moment) and light. π
Custom themes are defined as lists of key-values in the configuration files:
$XDG_CONFIG_HOME/meli/config.toml
$XDG_CONFIG_HOME/meli/themes/*.toml
The application theme is defined in the configuration as follows:
[terminal]
theme = "dark"
π¦ DESCRIPTION π¦
Themes for meli are described in the configuration language TOML, because they're key-value tables defined in the TERMINAL section of the configuration file. Every key defines the semantic location of the theme attribute inside the app. Like, mail.listing.compact.* keys? Those are the settings for the compact mail listing style. iykyk. π
A setting contains three fields:
fgβ foreground colorbgβ background colorattrsβ text attribute
"widget.key.label" = { fg = "Default", bg = "Default", attrs = "Default" }
Each field holds a value, and that value can be either a color/attribute, a link (aka a key name), or a valid alias. An alias is a string that starts with the "$" character, and no cap, it must be declared in advance in the color_aliases or attr_aliases fields of a theme. An alias' value can be literally any valid value β links and other aliases included β as long as they're valid. π«Ά
When it's a link, the setting's real value depends on the value of the referred key. This is how you get defaults inside a group of associated values, slay. But bestie β cyclic references in a theme result in an error:
spooky theme contains a cycle: fg: mail.listing.compact.even ->
mail.listing.compact.highlighted -> mail.listing.compact.odd ->
mail.listing.compact.even
Two themes are included by default, βlightβ and βdarkβ. π
π EXAMPLES π
Specific settings from already defined themes can be overwritten:
[terminal]
theme = "dark"
[terminal.themes.dark]
"mail.sidebar_highlighted_account" = { bg = "#ff4529" }
"mail.listing.attachment_flag" = { fg = "#ff4529" }
"mail.view.headers" = { fg = "30" }
"mail.view.body" = {fg = "HotPink3", bg = "LightSalmon1"}
# Linked value keys can be whatever key:
"mail.listing.compact.even_unseen" = { bg = "mail.sidebar_highlighted_account" }
# Linked color value keys can optionally refer to another field:
"mail.listing.compact.odd_unseen" = { bg = "mail.sidebar_highlighted_account.fg" }
# define new theme. Undefined settings will inherit from the default "dark" theme.
[terminal.themes."hunter2"]
color_aliases= { "Jebediah" = "#b4da55" }
"mail.listing.tag_default" = { fg = "$Jebediah" }
"mail.view.headers" = { fg = "White", bg = "Black" }
π CUSTOM THEMES π
Custom themes can live right inside your configuration files, or they can be saved independently in your $XDG_CONFIG_HOME/meli/themes/ directory as TOML files. β¨
Wanna start creating a theme right this second? You can begin by editing the default theme keys and values:
meli print-default-theme > ~/.config/meli/themes/new_theme.toml
new_theme.toml will now include all keys and values of the "dark" theme. π
meli print-loaded-themes
will print all loaded themes with the links resolved. π₯
π VALID ATTRIBUTE VALUES π
Case-sensitive. Don't play with her. π€
"Default""Bold""Dim""Italics""Underline""Undercurl""Blink""Reverse""Hidden"- Any combo of the above separated by a bitwise XOR
"|"eg"Dim | Italics"
β VALID COLOR VALUES β
Color values are of type String with the following valid contents:
"Default"is the terminal default. (Case-sensitive)- Hex triplet e.g.
#FFFFFFfor RGB colors. Three character shorthand is also valid, e.g.#09cβ#0099cc(Case-insensitive) 0-255byte for 256 colors.xterm(1)name but with some modifications (for a full table see COLOR NAMES addendum) (Case-sensitive)
π NO COLOR π
To completely disable ANSI colors, there are two options:
- Set the
use_coloroption (sectionterminal) tofalse, which istrueby default. - The
NO_COLORenvironmental variable, when present (regardless of its value), prevents the addition of ANSI color. When the configuration valueuse_coloris explicitly set totrueby the user,NO_COLORis ignored.
In this mode, cursor locations (i.e., currently selected entries/items) will use the βreverse videoβ ANSI attribute to invert the terminal's default foreground/background colors. π
π VALID KEYS π
theme_defaulterror_messagehighlightstatus.barstatus.command_barstatus.historystatus.history.hintsstatus.notificationtab.focusedtab.unfocusedtab.barwidgets.list.headerwidgets.form.labelwidgets.form.fieldwidgets.form.highlightedwidgets.options.highlightedmail.sidebarmail.sidebar_dividermail.sidebar_unread_countmail.sidebar_indexmail.sidebar_highlightedmail.sidebar_highlighted_unread_countmail.sidebar_highlighted_indexmail.sidebar_highlighted_accountmail.sidebar_highlighted_account_unread_countmail.sidebar_highlighted_account_indexmail.listing.compact.evenmail.listing.compact.oddmail.listing.compact.even_unseenmail.listing.compact.odd_unseenmail.listing.compact.even_selectedmail.listing.compact.odd_selectedmail.listing.compact.even_highlightedmail.listing.compact.odd_highlightedmail.listing.compact.even_highlighted_selectedmail.listing.compact.odd_highlighted_selectedmail.listing.plain.evenmail.listing.plain.oddmail.listing.plain.even_unseenmail.listing.plain.odd_unseenmail.listing.plain.even_selectedmail.listing.plain.odd_selectedmail.listing.plain.even_highlightedmail.listing.plain.odd_highlightedmail.listing.plain.even_highlighted_selectedmail.listing.plain.odd_highlighted_selectedmail.listing.conversationsmail.listing.conversations.subjectmail.listing.conversations.frommail.listing.conversations.datemail.listing.conversations.unseenmail.listing.conversations.highlightedmail.listing.conversations.selectedmail.listing.conversations.highlighted_selectedmail.view.headersmail.view.headers_namesmail.view.headers_areamail.view.bodymail.view.thread.indentation.amail.view.thread.indentation.bmail.view.thread.indentation.cmail.view.thread.indentation.dmail.view.thread.indentation.email.view.thread.indentation.fmail.listing.attachment_flagmail.listing.thread_snooze_flagmail.listing.tag_defaultpager.highlight_searchpager.highlight_search_current
β¨ COLOR NAMES β¨
okay bestie, here's the full color name dictionary, and it's literally a rainbow of options. every name maps to a byte value, so you can use either the name or the number. no cap. first chunk:
Aquaβ14Blackβ0Aquamarine1β122Maroonβ1Aquamarine2β86Greenβ2Aquamarine3β79Oliveβ3Blackβ0Navyβ4Blueβ12Purple1β5Blue1β21Tealβ6Blue2β19Silverβ7Blue3β20Greyβ8BlueVioletβ57Redβ9CadetBlueβ72Limeβ10CadetBlue1β73Yellowβ11Chartreuse1β118Blueβ12Chartreuse2β112Fuchsiaβ13Chartreuse3β82Aquaβ14Chartreuse4β70Whiteβ15Chartreuse5β76Grey0β16Chartreuse6β64NavyBlueβ17CornflowerBlueβ69DarkBlueβ18Cornsilk1β230Blue2β19Cyan1β51Blue3β20Cyan2β50Blue1β21Cyan3β43DarkGreenβ22DarkBlueβ18DeepSkyBlue5β23DarkCyanβ36DeepSkyBlue6β24DarkGoldenrodβ136DeepSkyBlue7β25DarkGreenβ22DodgerBlue3β26DarkKhakiβ143DodgerBlue2β27DarkMagentaβ90Green4β28DarkMagenta1β91SpringGreen6β29
and here's the rest of the list, because it was too long for one table:
DarkOliveGreen1β192Turquoise4β30DarkOliveGreen2β155DeepSkyBlue3β31DarkOliveGreen3β191DeepSkyBlue4β32DarkOliveGreen4β107DodgerBlue1β33DarkOliveGreen5β113Green2β34DarkOliveGreen6β149SpringGreen4β35DarkOrangeβ208DarkCyanβ36DarkOrange2β130LightSeaGreenβ37DarkOrange3β166DeepSkyBlue2β38DarkRedβ52DeepSkyBlue1β39DarkRed2β88Green3β40DarkSeaGreenβ108SpringGreen5β41DarkSeaGreen1β158SpringGreen2β42DarkSeaGreen2β193Cyan3β43
...okay so the list literally keeps going, no cap π here's the next chunk of the palette, each name with its byte value:
DarkSeaGreen3β151Β·DarkTurquoiseβ44DarkSeaGreen4β157Β·Turquoise2β45DarkSeaGreen5β115Β·Green1β46DarkSeaGreen6β150Β·SpringGreen3β47DarkSeaGreen7β65Β·SpringGreen1β48DarkSeaGreen8β71Β·MediumSpringGreenβ49DarkSlateGray1β123Β·Cyan2β50DarkSlateGray2β87Β·Cyan1β51DarkSlateGray3β116Β·DarkRedβ52DarkTurquoiseβ44Β·DeepPink8β53DarkVioletβ128Β·Purple4β54DarkViolet1β92Β·Purple5β55DeepPink1β199Β·Purple3β56DeepPink2β197Β·BlueVioletβ57DeepPink3β198Β·Orange3β58DeepPink4β125Β·Grey37β59
okay and then the table literally flips its whole vibe π the left half gets labelled name β with a plain byte column, and the right half is a plain name with byte β β so the two sides are sorted in opposite directions. same tea though, just mirrored. here we go:
DeepPink6β162Β·MediumPurple6β60DeepPink7β89Β·SlateBlue2β61DeepPink8β53Β·SlateBlue3β62DeepPink9β161Β·RoyalBlue1β63DeepSkyBlue1β39Β·Chartreuse6β64DeepSkyBlue2β38Β·DarkSeaGreen7β65DeepSkyBlue3β31Β·PaleTurquoise4β66DeepSkyBlue4β32Β·SteelBlueβ67DeepSkyBlue5β23Β·SteelBlue3β68DeepSkyBlue6β24Β·CornflowerBlueβ69DeepSkyBlue7β25Β·Chartreuse4β70DodgerBlue1β33Β·DarkSeaGreen8β71DodgerBlue2β27Β·CadetBlueβ72DodgerBlue3β26Β·CadetBlue1β73Fuchsiaβ13Β·SkyBlue3β74Gold1β220Β·SteelBlue1β75Gold2β142Β·Chartreuse5β76Gold3β178Β·PaleGreen4β77Greenβ2Β·SeaGreen4β78Green1β46Β·Aquamarine3β79Green2β34Β·MediumTurquoiseβ80Green3β40Β·SteelBlue2β81Green4β28Β·Chartreuse3β82GreenYellowβ154Β·SeaGreen3β83Greyβ8Β·SeaGreen1β84Grey0β16Β·SeaGreen2β85Grey100β231Β·Aquamarine2β86Grey11β234Β·DarkSlateGray2β87
and bestie we are still not done, hold on to ur seats π«Ά
β¦and the list just keeps going, bestie, no cap π this next chunk is still the name β byte pairs, laid out exactly like the table does it: left name next to its right-hand neighbour. Every single one, nothing skipped, because we don't do "etc." in this house π«Ά
Grey15=235 Β· DarkRed2=88Grey19=236 Β· DeepPink7=89Grey23=237 Β· DarkMagenta=90Grey27=238 Β· DarkMagenta1=91Grey3=232 Β· DarkViolet1=92Grey30=239 Β· Purple2=93Grey35=240 Β· Orange4=94Grey37=59 Β· LightPink3=95Grey39=241 Β· Plum4=96Grey42=242 Β· MediumPurple4=97Grey46=243 Β· MediumPurple5=98Grey50=244 Β· SlateBlue1=99Grey53=102 Β· Yellow4=100Grey54=245 Β· Wheat4=101Grey58=246 Β· Grey53=102Grey62=247 Β· LightSlateGrey=103Grey63=139 Β· MediumPurple=104Grey66=248 Β· LightSlateBlue=105Grey69=145 Β· Yellow5=106Grey7=233 Β· DarkOliveGreen4=107Grey70=249 Β· DarkSeaGreen=108Grey74=250 Β· LightSkyBlue2=109Grey78=251 Β· LightSkyBlue3=110Grey82=252 Β· SkyBlue2=111Grey84=188 Β· Chartreuse2=112Grey85=253 Β· DarkOliveGreen5=113Grey89=254 Β· PaleGreen3=114Grey93=255 Β· DarkSeaGreen5=115Honeydew2=194 Β· DarkSlateGray3=116HotPink=205 Β· SkyBlue1=117HotPink1=206 Β· Chartreuse1=118HotPink2=169 Β· LightGreen=119
okay and it rolls straight into the next block of rows, same vibe, same rules πΈ
HotPink3=132 Β· LightGreen1=120HotPink4=168 Β· PaleGreen1=121IndianRed=131 Β· Aquamarine1=122IndianRed1=167 Β· DarkSlateGray1=123IndianRed2=204 Β· Red2=124IndianRed3=203 Β· DeepPink4=125Khaki1=228 Β· MediumVioletRed=126Khaki3=185 Β· Magenta4=127LightCoral=210 Β· DarkViolet=128LightCyan2=195 Β· Purple=129LightCyan3=152 Β· DarkOrange2=130LightGoldenrod1=227 Β· IndianRed=131LightGoldenrod2=222 Β· HotPink3=132LightGoldenrod3=179 Β· MediumOrchid3=133
heads up bestie π some names pop up more than once in here βGrey53lands on102twice, and so doIndianRedat131andHotPink3at132. not a typo, not a glitch, that's just literally what the list says, so don't come for me π
and yeah, that's only part of it β there's still more list coming, so stay with me π¦
β¦and bestie the list just keeps going, because of course it does π here's the next chunk of names and their bytes, in the exact order they show up:
LightGoldenrod4β221MediumOrchidβ134LightGoldenrod5β186MediumPurple2β135LightGreenβ119DarkGoldenrodβ136LightGreen1β120LightSalmon2β137LightPink1β217RosyBrownβ138LightPink2β174Grey63β139LightPink3β95MediumPurple3β140LightSalmon1β216MediumPurple1β141LightSalmon2β137Gold2β142LightSalmon3β173DarkKhakiβ143LightSeaGreenβ37NavajoWhite3β144LightSkyBlue1β153Grey69β145LightSkyBlue2β109LightSteelBlue3β146LightSkyBlue3β110LightSteelBlueβ147LightSlateBlueβ105Yellow6β148LightSlateGreyβ103DarkOliveGreen6β149
okay and now a whole fresh table starts up, same deal: name β on one side, byte on the other, then another name with byte β. literally the same energy, new page π¦
LightSteelBlueβ147DarkSeaGreen6β150LightSteelBlue1β189DarkSeaGreen3β151LightSteelBlue3β146LightCyan3β152LightYellow3β187LightSkyBlue1β153Limeβ10GreenYellowβ154Magenta1β201DarkOliveGreen2β155Magenta2β165PaleGreen2β156Magenta3β200DarkSeaGreen4β157Magenta4β127DarkSeaGreen1β158Magenta5β163PaleTurquoise1β159Magenta6β164Red3β160Maroonβ1DeepPink9β161MediumOrchidβ134DeepPink6β162MediumOrchid1β171Magenta5β163MediumOrchid2β207Magenta6β164MediumOrchid3β133Magenta2β165MediumPurpleβ104DarkOrange3β166MediumPurple1β141IndianRed1β167MediumPurple2β135HotPink4β168MediumPurple3β140HotPink2β169MediumPurple4β97Orchidβ170MediumPurple5β98MediumOrchid1β171MediumPurple6β60Orange2β172MediumSpringGreenβ49LightSalmon3β173MediumTurquoiseβ80LightPink2β174MediumVioletRedβ126Pink3β175MistyRose1β224Plum3β176
ngl bestie, yes some of these names show up more than once with the same byte β that's not a typo on my part, it's just how the table rolls π keep scrolling, there's more comingβ¦
okay so the roster just keeps GOING and honestly? iconic π
this is still the same two-column situation β name on the left, byte on the right, twice across, and every single one of them matters. no skimming, bestie, we're collecting them all like PokΓ©mon β¨
MistyRose3β181Β·Violetβ177NavajoWhite1β223Β·Gold3β178NavajoWhite3β144Β·LightGoldenrod3β179
new block, same energy πΈ
Navyβ4Β·Tanβ180NavyBlueβ17Β·MistyRose3β181Oliveβ3Β·Thistle3β182Orange1β214Β·Plum2β183Orange2β172Β·Yellow3β184Orange3β58Β·Khaki3β185Orange4β94Β·LightGoldenrod5β186OrangeRed1β202Β·LightYellow3β187Orchidβ170Β·Grey84β188Orchid1β213Β·LightSteelBlue1β189Orchid2β212Β·Yellow2β190PaleGreen1β121Β·DarkOliveGreen3β191PaleGreen2β156Β·DarkOliveGreen1β192PaleGreen3β114Β·DarkSeaGreen2β193PaleGreen4β77Β·Honeydew2β194PaleTurquoise1β159Β·LightCyan2β195PaleTurquoise4β66Β·Red1β196PaleVioletRed1β211Β·DeepPink2β197Pink1β218Β·DeepPink3β198Pink3β175Β·DeepPink1β199Plum1β219Β·Magenta3β200Plum2β183Β·Magenta1β201Plum3β176Β·OrangeRed1β202Plum4β96Β·IndianRed3β203Purpleβ129Β·IndianRed2β204Purple1β5Β·HotPinkβ205Purple2β93Β·HotPink1β206Purple3β56Β·MediumOrchid2β207Purple4β54Β·DarkOrangeβ208Purple5β55Β·Salmon1β209
yes, a few names show up more than once across these tables. that's not me glitching, that's literally how it's written. eyes on the bytes, bestie π
and the last stretch of this block π¦
Redβ9Β·LightCoralβ210Red1β196Β·PaleVioletRed1β211Red2β124Β·Orchid2β212Red3β160Β·Orchid1β213RosyBrownβ138Β·Orange1β214RoyalBlue1β63Β·SandyBrownβ215Salmon1β209Β·LightSalmon1β216SandyBrownβ215Β·LightPink1β217SeaGreen1β84Β·Pink1β218SeaGreen2β85Β·Plum1β219SeaGreen3β83π Β·Gold1β220β¨SeaGreen4β78π Β·LightGoldenrod4β221πΎSilverβ7πͺ© Β·LightGoldenrod2β222πΎSkyBlue1β117βοΈ Β·NavajoWhite1β223ποΈSkyBlue2β111βοΈ Β·MistyRose1β224π·SkyBlue3β74βοΈ Β·Thistle1β225πSlateBlue1β99π¦ Β·Yellow1β226πSlateBlue2β61π¦ Β·LightGoldenrod1β227πΎSlateBlue3β62π¦ Β·Khaki1β228π§₯SpringGreen1β48π± Β·Wheat1β229πΎSpringGreen2β42π± Β·Cornsilk1β230π½SpringGreen3β47π± Β·Grey100β231π©ΆSpringGreen4β35π± Β·Grey3β232π©ΆSpringGreen5β41π± Β·Grey7β233π©ΆSpringGreen6β29π± Β·Grey11β234π©ΆSteelBlueβ67π© Β·Grey15β235π©ΆSteelBlue1β75π© Β·Grey19β236π©ΆSteelBlue2β81π© Β·Grey23β237π©ΆSteelBlue3β68π© Β·Grey27β238π©ΆTanβ180π§Έ Β·Grey30β239π©Ά
okay and here's the next chunk of the list, same deal, name β / byte / name / byte β:
Tealβ6π« Β·Grey35β240π©ΆThistle1β225π Β·Grey39β241π©ΆThistle3β182π Β·Grey42β242π©ΆTurquoise2β45π©΅ Β·Grey46β243π©ΆTurquoise4β30π©΅ Β·Grey50β244π©ΆVioletβ177π£ Β·Grey54β245π©ΆWheat1β229πΎ Β·Grey58β246π©ΆWheat4β101πΎ Β·Grey62β247π©ΆWhiteβ15π€ Β·Grey66β248π©ΆYellowβ11π Β·Grey70β249π©ΆYellow1β226π Β·Grey74β250π©ΆYellow2β190π Β·Grey78β251π©ΆYellow3β184π Β·Grey82β252π©ΆYellow4β100π Β·Grey85β253π©ΆYellow5β106π Β·Grey89β254π©ΆYellow6β148π Β·Grey93β255π©Ά
and that's the whole rainbow bestie, every single name accounted for, not one byte skipped π β¨
πΈ SEE ALSO πΈ
π STANDARDS π
- TOML Standard v.0.5.0: https://toml.io/en/v0.5.0
- NO_COLOR: disabling ANSI color output by default: https://no-color.org/
π AUTHORS π
Copyright 2017β2024 Manos Pitsidianakis <manos@pitsidianak.is> π«Ά
Released under the GPL, version 3 or greater. This software carries no warranty of any kind. (See COPYING for full copyright and warranty notices.)
no cap, zero warranty, they said it, not me π read COPYING for the full receipts fr fr
π Links
- Website: https://meli-email.org
- Main git repository and issue tracker: https://git.meli-email.org/meli/meli
- Official read-only git mirror on codeberg.org: https://codeberg.org/meli/meli
- Official read-only git mirror on github.com: https://github.com/meli/meli
- meli crate on crates.io: https://crates.io/crates/meli
and that's a wrap on the whole page bestie π this version dropped as part of the Debian build, dated March 10, 2024, and yes it's the MELI-THEMES(5) page you just read top to bottom like a champ. go make something gorgeous πβ¨
π¦ where this page comes from
- alpine 3.24: meli-doc 0.8.13-r0 Β· GPL-3.0-or-later
- debian trixie: meli 0.8.11+dfsg-1+b1 Β· GPL-3.0-or-later
- nixos 26.05: meli 0.8.13
- nixpkgs unstable: meli 0.8.13
- opensuse-leap 16.0: meli 0.8.10-bp160.1.14 Β· GPL-3.0-or-later
- opensuse-leap 16.0: meli 0.8.10-bp160.1.14 Β· GPL-3.0-or-later
- opensuse-leap 16.0: meli 0.8.10-bp160.1.14 Β· GPL-3.0-or-later
- opensuse-leap 16.0: meli 0.8.10-bp160.1.14 Β· GPL-3.0-or-later
- ubuntu questing: meli 0.8.11+dfsg-1
- ubuntu resolute: meli 0.8.13+dfsg-3 Β· GPL-3.0-or-later
- ubuntu stonking: meli 0.8.13+dfsg-4build1 Β· GPL-3.0-or-later
- Copyright 2017-2020 Manos Pitsidianakis
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms