I came across all of these issues and many more trying to make a good light color scheme for my systems. Two interesting findings I did not see discussed:
1. It makes sense in retrospect, but I was very surprised at how much more subtle light themes are compared to dark when viewed on different screens; of course their hardware and software configs lead to variations on the color output, but light dominant changes are perceived so much more drastically than dark ones. This is a serious issue if you will be porting your theme to computers with a variety of screens and configurations.
2. Occasionally, you need to drop to a linux or bsd console with very limited support for fonts and fancy colors. Then your `fd` and `exa/lsd/whatever` may be unusable and annoying, especially if you have mapped the latter to `ls`. I managed, after a long struggle, to get a working fbterm in my system to get decent terminal features without X, but fbterm has its own issues. You need to account for this use-case, especially when configuring vim colorschemes: make sure that you have a fallback theme for a feature-poor console or you have really practiced typing vim commands blind :D
Edit: here is a screenshot of my stylized fbterm screen, obviously not for serious work, but meant to demonstrate what you can do without X: https://i.imgur.com/RbDRgtD.png
> I was very surprised at how much more subtle light themes are compared to dark when viewed on different screens.
This does not surprise me. I do analog black and white printing (from film) and it's a well known thing that our eye is much better at detecting subtle tonal changes in light areas of a print than darker ones. For this reason, a lot of the time in tweaking the right exposure and contrast for a print is spent to make those hightlights look "just right". I don't print digitally, but I am sure the same principles will apply there too.
> Occasionally, you need to drop to a linux or bsd console with very limited support for fonts and fancy colors. Then your `fd` and `exa/lsd/whatever` may be unusable and annoying, especially if you have mapped the latter to `ls`.
Normally you should be able to rely on a properly set TERM variable [1], and CLI utilities should respect the capabilities they can gain from the TERM variable.
Sadly, a lot of "modern" CLI tool frameworks - particularly those written in JavaScript - tend to ignore this.
Was going to say "hey just set $TERM", then saw your comment and actually read the article which covers all of this pretty well. But, not only am I annoyed about this, but I feel that being annoyed about this confirms I am definitely getting old. yells at cloud
Starting using Linux at 15 in 2002. Didn't realise how "early" that was then (especially compared to now, seemed old then). Been working professionally in the space since 2006. Now I'm 37. Yikes.
On the plus side it definitely works for your more basic tools.. for most of the non-basic ones, as a hack you could pipe the output to "cat" as most tools try to detect if the terminal is interactive or not to remove colors from output being piped. It also annoys me we don't have a better way to signal that, and I have to pass --colors and hope it's supported to every command where I want the colors but just to filter the output by line with grep.
I had a recent experience trying to show a large number of data series by different colours on a plot in Excel.
I found the best option for easily distinguishing a large number of colours was the monochromatic spectral "rainbow" colours on a black background (there's also a setting to make the data points have a bit of "bloom" aura in the same colour so they look like dots of light).
It makes sense from a colour saturation perspective (i.e. signal to noise ratio across the spectrum) that a black background is better.
You can pretty much have 10 different colours
EDIT: Another benefit is it conveys "sequence/order/distance" information: yellow is between red and green; orange is between red and yellow, etc. It's easy to subdivide and interpret how "close together" two colours are.
That sounds reasonable. But sometimes I have a bunch of signals with some of them being pairs, so having a dark and light version of the same color helps to see them together. Does this work with adjacent rainbow colors as well?
> Occasionally, you need to drop to a linux or bsd console with very limited support for fonts and fancy colors. Then your `fd` and `exa/lsd/whatever` may be unusable and annoying, especially if you have mapped the latter to `ls`.
I just did a check on my NixOS system there and the console seems fine? The ANSI blue on black for directories in eza is a bit... meh, but it's perfectly readable and the same is true for the default colour scheme for ls on MacOS terminal
Most terminal emulators ship with a garbage default colour scheme. So change that.
Personally I'm a fan of Solarized (specifically dark, but I like their light theme too). However even if you don't like Solarized, there are plenty of other themes that are readable with any colour against the default backgrounds.
Step 2:
Avoid any CLI tool that uses escape sequences for 8bit or 24bit colours by default. This might be an unpopular opinion, but I actually consider that as user hostile. Reason being: I've already chosen a the best terminal colour scheme for my readability requirements (remember, this will differ for different people). Having a developer override that because they fancy themselves as a pseudo-designer is not helpful. By all means, they can have an option to enable themes in their tool if they wish, but that should be opt-in, not the default.
As someone who spends most of their life in the terminal, following those two rules is enough to provide a consistent and easy terminal reading environment with almost-zero configuration overhead.
I think the real problem is that we indulge developers using 8bit and 24bit colour escape codes.
> By all means, they can have an option to enable themes in their tool if they wish, but that should be opt-in, not the default.
This touches on the problem of good defaults. If the user has to configure it then the user must know that it is configurable and then do it. This is a serious hurdle and only a tiny fraction of users will do it.
Over the years I've come to the conclusion that you must throw your new features into the face and shove good defaults down the throats of users, otherwise these feature are hardly used.
8bit and 24bit colors are already opt-in and you can configure it. Your TERM and COLORTERM environmental variables determine if a (well behaved) terminal program will use those colors.
> Over the years I've come to the conclusion that you must throw your new features into the face and shove good defaults down the throats of users, otherwise these feature are hardly used.
Agreed to an extent. I wouldn't call ignoring the systems colour preferences as "good defaults". But I do agree with your more general point.
> 8bit and 24bit colors are already opt-in and you can configure it. Your TERM and COLORTERM environmental variables determine if a (well behaved) terminal program will use those colors.
Unfortunately it's not that simple. Both the "256color" suffix to $TERM and $COLORTERM env vars report terminal compatibility -- not user preference.
Neither are standards either. It's a push to even call them a de facto standard because they're often not used by either terminal emulators nor application developer alike.
There is another env var that does report user preferences: $COLORFGBG, but that receives even less support than the former two vars.
There's also $NO_COLOR (or is $NOCOLOR?), which seems to be honored a little better. However the problem with this is it turns colour off completely. ie you cannot specify "use 4bit but not 8bit nor 24bit colour".
Like all things terminal detection wise, it's all a big fat steaming mess of inconsistencies. Which is why I think the best default is 3/4bit or no colour at all if $NO_COLOR / not a TTY. And have all the cool 24bit themes as an optional extra.
Solarized Dark, specifically, is not well-suited for terminal use, because the author has assigned "bright black" to nearly the same color as the background. Many applications expect that 'bright black' text will be visible against the background. See here for many examples: https://github.com/altercation/solarized/issues/220
Nearly all other colorschemes represent 'bright black' as a gray color, which is readable against the black background.
> themes that are readable with any colour against the default backgrounds.
Yes, but then there are applications that set both the text and background colour. For example pamix sets the background to black, or tmux's statusline, or ngrok. And you end up in a rabbit hole trying to deal with that.
I don't know what pamix is but my rule of thumb is to use only apps that supports themes that are common in most terminals, text/code editor like solarized, gruvbox...
>> Avoid any CLI tool that uses escape sequences for 8bit or 24bit colours by default.
I was going to point out that the author never takes a step back and asks "What would be the best way to handle this?" The problem there is we have to define what "best" is. IMHO that involves a number of principles. My preferences are:
1) Any user customization should be in one place.
2) The impact on programs should be minimal (in LoC for example).
Both of those suggest the solution belongs in the terminal.
IMHO it starts with terminal programs having sane default colors. What that means is fuzzy, but so is this whole discussion. IMHO colors should follow the "standard" so that blue is still recognizably blue. But consideration should be given to the common forms of color blindness - for example I have a hard time reading pure red on black (adding a bit of anything helps this, don't just use ff0000).
Once terminals get fixed to have sane defaults, CLI programs should use those 16 standard colors. Any attempt to use 24bit here is either saying "I give up on getting those terminal folks to offer sanity" or it's saying something like "I know best", but either way users end up with N programs they have to configure. Lets not define themes in cli apps OK? Remember, this is my answer to "what would be the best way to handle this?"
I have similar thoughts when it comes to web sites and fonts. Present content in HTML so users can configure how they want to see it. Similar for page formatting - it's not a magazine layout, let it flow.
Also stuff in desktop software. IMHO Wayland compositors should remember window placement. It was stupid for every X program to store and restore its window position. Wayland says knowing about the environment is a security issue (and I agree) but then it becomes the DEs job to handle this memory. It also unburdens ALL the apps from having code for this.
There are other areas where that question comes up "Where in the software stack should this thing be handled?" Whatever your opinion, I believe you should start by answering the questions around that word "should". What are the goals in selecting where a thing gets handled? My answers always lean toward simplicity and maintainability. What other principles might I adopt to answer these questions?
Avoid any CLI tool that uses escape sequences for 8bit or 24bit colours by default.
How difficult is this in practice?
(Julia's article mentions this idea too without going deeper into the struggles)
A related topic is: Do terminal color schemes only concern themselves with the 16 base colors or do they also meddle with the RGB and greyscale parts. I mean you could also adapt the 8bit and 16bit colors to your readability requirements.
There is no 16bit. You cannot alter the 24bit (at least not on your average terminal emulator).
Same is true for 8bit. Most terminal emulators tend not to support altering those colours either.
In practice, the only application I use that I've had to configure the colours for was tmux. But I tend to forget about tmux because its one of those applications that needs a lot of a configuration from the outset anyway (in my opinion at least).
There might be other "must have" tools that set the background colours too. I've either not needed them personally, or have completely forgotten about them
Step2: do agree with the fact someone making a CLI tool should respect user preferences. it's also much easier just not to use the sequences in the tool so I don't get why people would do that in the first place :S.
Step 1: I think here maybe the default setting should be solarized-dark/light on terminals. It's honestly a good and sane default. It's purpose built to be less hostile on the eyes in my opinion, which should likely be what's aimed for in a default setting... the themes and colors are there for people who like to stare at their terminal all day (if you only use it once or twice then you don't care about what color it has) so it should be eye-friendly defaults. if people want to muck about changing it to their own custom theme they won't be bothered about defaults anyway since they will immediately customize it.
I personally hate the fact I even need to swap a theme, or download and reformat some Xresources file tediously (while looking at godawful colors in the process!). I just want my eyes not to burn.. don't care what colors yield that result.
I would disagree that solarized is a good default, the colour it uses for blue (which is used by `ls' to show directories) is so low contrast it wears my eyes out.
I completely agree. And for what it's worth, I set Solarized dark as the default theme on the terminal emulator I've written. Though it's not quite ready to be used as anyone's primary TERM just yet.
Would be good to check colours (if you're someone who picks colours) against the new APCA algorithm (Advanced Perception of Colour), which will supersede the existing x:y one in the upcoming WCAG 3.0 (which may take a few years yet). APCA takes font size, weight, foreground/background, and even apparently ambient light/surroundings and intended purpose into consideration. It would be neat if terminal emulators could use the device's light sensor to optimize the contrast based on environmental factors.
I've actually done this manually for my current terminal color scheme, because I could not find a single premade theme that satisfied my personal contrast requirements for all the ANSI colors.
And then we have the absolute mad men that just want to disable colors altogether[0]. I am tempted to try it myself, but I also like the pretty colors.
is my only vim configuration because terminal color sets were designed by computer programmers and electrical engineers and other people who don’t understand that the important thing about colors is not the colors but the brightness.
If you get used to monochrome terminals, you'll start to find that most colours are distracting and attention-getting. I wonder if there's a correlation between those who don't want colour in their terminal and those who have a very strong adblocker and/or extensively use reader mode in their browsers.
Color sequences are not portable and known to break things (e.g. Jupyter sessions crashing due to colored pytest reports) and nothing but a liability if you're just piping the output. I think it's more about having the option.
Especially coding, I find almost all coloring to be distracting and counterproductive. Doubly so when I'm bouncing back and forth between Linux ans Windows. Many tools' default use of color borders on (or crashes head on into) unusable.
Some tools offer a --color=never option, and a good number respect NO_COLOR. Unfortunately, not all do, and even those that purport to assume that those modes will only be used for use in pipelines, programmatic interfaces, and such. That leads to all sorts of unfortunate behavior.
They have a consistent color scheme concept of semantically significant color temperature, while leaning warm to save your eyes from staring at so much blue light. Comes with alacritty colorscheme
Same. There are few things that annoy me more when working in the shell than unexpected emojis in outputs to be cute or more accessible or whatever. I'll take the occasional readline and curses shenanigans but even then there's usually a way to disable those to have pure character outputs and no control chars.
I was using "script" command to record my interactions on the terminal and with colors, it was a mess. Pretty sure there are other legitimate use cases.
I've wanted to use a light theme for my terminal for a long time, but I've always given up since there are just too many programs that use custom (non-ANSI) colors that are optimized for a dark terminal background. For some of those programs, the colors are configurable, but it seemed too much of a hassle to configure every single program. So now I'm just using a dark terminal background, but with a hand-picked ANSI theme where all the colors have a sufficient contrast ratio for me and also get a pass on APCA / WCAG 3 contrast checkers. I'm happy with it. :)
For some of us with higher-order visual aberrations, dark mode is a non-starter. (The converse holds for some people with cataracts.) The OSC 11 control sequence lets a program determine the background color, but few bother. Usually, someone just thinks yellow warning messages look cool, and that's the end of it.
That also leads to problem 12: Certain popular terminals that default to setting TERM=xterm256-color while not being xterm-compatible.
Edit: I just came across `xtermcontrol`, which can abstract the background check in scripts, and is in all the major package managers.
It doesn't have to be cataracts, my eyes are just unusually sensitive to light. I find the hacker news theme borderline during the daytime, and can only handle it for short bursts at night with the brightness on my monitor set to the lowest setting.
It's probably too late for terminals to add a concept of semantic color, other than "default foreground" and "default background", but the situation as it is forces TUI authors to either stick to the basic eight or make colors completely user-configurable, if they don't want to leave anybody out.
By semantic color I mean what editors do, where the presentation is separated from the intention. Unclear how to even start with that for terminals though.
(To someone out there about to tell me about how I can custom theme HN: please consider that I might spend too much time here already and don't need it to be easy to use in the dark. Cheers)
I was for a while faking a 16-color terminal without support for 256 colors just to avoid this configuration hell. I also tried https://no-color.org/ because I’d rather have no colors than bad colors.
These days I just gave up and manually configure most apps to use ANSI colors (e.g. fzf etc have command switches for that), and let Vim and Emacs be the only non-ANSI apps which are instead set to match the colorscheme I use in the rest of the terminal. (Although stuff like vim-dim let’s you go one step further if you want.)
I've been using a lightly customised version of the FlatUI colour scheme for around a decade and really haven't run into any situations where it's caused issues:
I've used Apple's Terminal for a long time, way back when there was a set of color schemes called "Terminal Fructose" that was nice, I would have different colored backgrounds for different tasks. Apple at some point built that in with their themes.
However, Apple have languished with their Terminal support, they don't to >256 colors and some of the other more modern stuff is lacking and it doesn't really work with a Neovim+LazyVim setup.
I've been trying to find a "better" terminal and have bounced around between iTerm2, Kitty, Alacritty and Wezterm, but while they all are more "modern", I find that none of them seem to have that basic "New Window with Profile ..." option that lets me quickly open windows with different background colors/themes (at least without some screwing around).
Currently settled on Wezterm, mostly because it also works on Windows and I can share my wezterm.lua configuration (I should note that Windows Terminal is actually pretty good too). I still do find my self running Apple Terminal for quick things (e.g. using python3 as a REPL to do math or testing hex/binary stuff out etc).
Yes, you are right! iTerm2 does -- as long as you have more than the default profile set up (and you have to set them up yourself, which is easy enough).
I stuck with Wezterm for two reasons: 1) I can share the config across multiple platforms easily 2) Lua for configuration.
There are a few things I miss from iTerm2 (mostly mouse related), but otherwise it took me a few evenings to configure it to my liking (cmd-n opens a new window at the default dir, not the current one) and I've been a happy user since.
If you want to add "New Window with Profile..." to WezTerm, you can probably hack something into either `launch_menu` [1] (for starting different shells), or `augment-command-palette` [2] (for adding items to the command palette).
1. It makes sense in retrospect, but I was very surprised at how much more subtle light themes are compared to dark when viewed on different screens; of course their hardware and software configs lead to variations on the color output, but light dominant changes are perceived so much more drastically than dark ones. This is a serious issue if you will be porting your theme to computers with a variety of screens and configurations.
2. Occasionally, you need to drop to a linux or bsd console with very limited support for fonts and fancy colors. Then your `fd` and `exa/lsd/whatever` may be unusable and annoying, especially if you have mapped the latter to `ls`. I managed, after a long struggle, to get a working fbterm in my system to get decent terminal features without X, but fbterm has its own issues. You need to account for this use-case, especially when configuring vim colorschemes: make sure that you have a fallback theme for a feature-poor console or you have really practiced typing vim commands blind :D
Edit: here is a screenshot of my stylized fbterm screen, obviously not for serious work, but meant to demonstrate what you can do without X: https://i.imgur.com/RbDRgtD.png
This does not surprise me. I do analog black and white printing (from film) and it's a well known thing that our eye is much better at detecting subtle tonal changes in light areas of a print than darker ones. For this reason, a lot of the time in tweaking the right exposure and contrast for a print is spent to make those hightlights look "just right". I don't print digitally, but I am sure the same principles will apply there too.
Normally you should be able to rely on a properly set TERM variable [1], and CLI utilities should respect the capabilities they can gain from the TERM variable.
Sadly, a lot of "modern" CLI tool frameworks - particularly those written in JavaScript - tend to ignore this.
[1] https://www.gnu.org/software/gettext/manual/html_node/The-TE...
Starting using Linux at 15 in 2002. Didn't realise how "early" that was then (especially compared to now, seemed old then). Been working professionally in the space since 2006. Now I'm 37. Yikes.
On the plus side it definitely works for your more basic tools.. for most of the non-basic ones, as a hack you could pipe the output to "cat" as most tools try to detect if the terminal is interactive or not to remove colors from output being piped. It also annoys me we don't have a better way to signal that, and I have to pass --colors and hope it's supported to every command where I want the colors but just to filter the output by line with grep.
Anyway...
I found the best option for easily distinguishing a large number of colours was the monochromatic spectral "rainbow" colours on a black background (there's also a setting to make the data points have a bit of "bloom" aura in the same colour so they look like dots of light).
It makes sense from a colour saturation perspective (i.e. signal to noise ratio across the spectrum) that a black background is better.
You can pretty much have 10 different colours
EDIT: Another benefit is it conveys "sequence/order/distance" information: yellow is between red and green; orange is between red and yellow, etc. It's easy to subdivide and interpret how "close together" two colours are.
Really good colors and organization of the terminals, it would be great for serious work too in my view =p
https://pastebin.com/RgbgLUTq
[0] https://github.com/xlucn/dotfiles
It is Lu Xu's dotfiles you should focus on if you want to understand how fb* tools work.
I invoke fbterm via this script to set the bg image:
I just did a check on my NixOS system there and the console seems fine? The ANSI blue on black for directories in eza is a bit... meh, but it's perfectly readable and the same is true for the default colour scheme for ls on MacOS terminal
Step 1:
Most terminal emulators ship with a garbage default colour scheme. So change that.
Personally I'm a fan of Solarized (specifically dark, but I like their light theme too). However even if you don't like Solarized, there are plenty of other themes that are readable with any colour against the default backgrounds.
Step 2:
Avoid any CLI tool that uses escape sequences for 8bit or 24bit colours by default. This might be an unpopular opinion, but I actually consider that as user hostile. Reason being: I've already chosen a the best terminal colour scheme for my readability requirements (remember, this will differ for different people). Having a developer override that because they fancy themselves as a pseudo-designer is not helpful. By all means, they can have an option to enable themes in their tool if they wish, but that should be opt-in, not the default.
As someone who spends most of their life in the terminal, following those two rules is enough to provide a consistent and easy terminal reading environment with almost-zero configuration overhead.
I think the real problem is that we indulge developers using 8bit and 24bit colour escape codes.
This touches on the problem of good defaults. If the user has to configure it then the user must know that it is configurable and then do it. This is a serious hurdle and only a tiny fraction of users will do it.
Over the years I've come to the conclusion that you must throw your new features into the face and shove good defaults down the throats of users, otherwise these feature are hardly used.
8bit and 24bit colors are already opt-in and you can configure it. Your TERM and COLORTERM environmental variables determine if a (well behaved) terminal program will use those colors.
Agreed to an extent. I wouldn't call ignoring the systems colour preferences as "good defaults". But I do agree with your more general point.
> 8bit and 24bit colors are already opt-in and you can configure it. Your TERM and COLORTERM environmental variables determine if a (well behaved) terminal program will use those colors.
Unfortunately it's not that simple. Both the "256color" suffix to $TERM and $COLORTERM env vars report terminal compatibility -- not user preference.
Neither are standards either. It's a push to even call them a de facto standard because they're often not used by either terminal emulators nor application developer alike.
There is another env var that does report user preferences: $COLORFGBG, but that receives even less support than the former two vars.
There's also $NO_COLOR (or is $NOCOLOR?), which seems to be honored a little better. However the problem with this is it turns colour off completely. ie you cannot specify "use 4bit but not 8bit nor 24bit colour".
Like all things terminal detection wise, it's all a big fat steaming mess of inconsistencies. Which is why I think the best default is 3/4bit or no colour at all if $NO_COLOR / not a TTY. And have all the cool 24bit themes as an optional extra.
Nearly all other colorschemes represent 'bright black' as a gray color, which is readable against the black background.
Yes, but then there are applications that set both the text and background colour. For example pamix sets the background to black, or tmux's statusline, or ngrok. And you end up in a rabbit hole trying to deal with that.
>> Avoid any CLI tool that uses escape sequences for 8bit or 24bit colours by default.
I was going to point out that the author never takes a step back and asks "What would be the best way to handle this?" The problem there is we have to define what "best" is. IMHO that involves a number of principles. My preferences are:
1) Any user customization should be in one place.
2) The impact on programs should be minimal (in LoC for example).
Both of those suggest the solution belongs in the terminal.
IMHO it starts with terminal programs having sane default colors. What that means is fuzzy, but so is this whole discussion. IMHO colors should follow the "standard" so that blue is still recognizably blue. But consideration should be given to the common forms of color blindness - for example I have a hard time reading pure red on black (adding a bit of anything helps this, don't just use ff0000).
Once terminals get fixed to have sane defaults, CLI programs should use those 16 standard colors. Any attempt to use 24bit here is either saying "I give up on getting those terminal folks to offer sanity" or it's saying something like "I know best", but either way users end up with N programs they have to configure. Lets not define themes in cli apps OK? Remember, this is my answer to "what would be the best way to handle this?"
I have similar thoughts when it comes to web sites and fonts. Present content in HTML so users can configure how they want to see it. Similar for page formatting - it's not a magazine layout, let it flow.
Also stuff in desktop software. IMHO Wayland compositors should remember window placement. It was stupid for every X program to store and restore its window position. Wayland says knowing about the environment is a security issue (and I agree) but then it becomes the DEs job to handle this memory. It also unburdens ALL the apps from having code for this.
There are other areas where that question comes up "Where in the software stack should this thing be handled?" Whatever your opinion, I believe you should start by answering the questions around that word "should". What are the goals in selecting where a thing gets handled? My answers always lean toward simplicity and maintainability. What other principles might I adopt to answer these questions?
A styling service from systemd.
How difficult is this in practice? (Julia's article mentions this idea too without going deeper into the struggles)
A related topic is: Do terminal color schemes only concern themselves with the 16 base colors or do they also meddle with the RGB and greyscale parts. I mean you could also adapt the 8bit and 16bit colors to your readability requirements.
Same is true for 8bit. Most terminal emulators tend not to support altering those colours either.
In practice, the only application I use that I've had to configure the colours for was tmux. But I tend to forget about tmux because its one of those applications that needs a lot of a configuration from the outset anyway (in my opinion at least).
There might be other "must have" tools that set the background colours too. I've either not needed them personally, or have completely forgotten about them
Step 1: I think here maybe the default setting should be solarized-dark/light on terminals. It's honestly a good and sane default. It's purpose built to be less hostile on the eyes in my opinion, which should likely be what's aimed for in a default setting... the themes and colors are there for people who like to stare at their terminal all day (if you only use it once or twice then you don't care about what color it has) so it should be eye-friendly defaults. if people want to muck about changing it to their own custom theme they won't be bothered about defaults anyway since they will immediately customize it.
I personally hate the fact I even need to swap a theme, or download and reformat some Xresources file tediously (while looking at godawful colors in the process!). I just want my eyes not to burn.. don't care what colors yield that result.
[0] https://no-color.org/
Dead Comment
Especially coding, I find almost all coloring to be distracting and counterproductive. Doubly so when I'm bouncing back and forth between Linux ans Windows. Many tools' default use of color borders on (or crashes head on into) unusable.
Some tools offer a --color=never option, and a good number respect NO_COLOR. Unfortunately, not all do, and even those that purport to assume that those modes will only be used for use in pipelines, programmatic interfaces, and such. That leads to all sorts of unfortunate behavior.
They have a consistent color scheme concept of semantically significant color temperature, while leaning warm to save your eyes from staring at so much blue light. Comes with alacritty colorscheme
That also leads to problem 12: Certain popular terminals that default to setting TERM=xterm256-color while not being xterm-compatible.
Edit: I just came across `xtermcontrol`, which can abstract the background check in scripts, and is in all the major package managers.
It's probably too late for terminals to add a concept of semantic color, other than "default foreground" and "default background", but the situation as it is forces TUI authors to either stick to the basic eight or make colors completely user-configurable, if they don't want to leave anybody out.
By semantic color I mean what editors do, where the presentation is separated from the intention. Unclear how to even start with that for terminals though.
(To someone out there about to tell me about how I can custom theme HN: please consider that I might spend too much time here already and don't need it to be easy to use in the dark. Cheers)
These days I just gave up and manually configure most apps to use ANSI colors (e.g. fzf etc have command switches for that), and let Vim and Emacs be the only non-ANSI apps which are instead set to match the colorscheme I use in the rest of the terminal. (Although stuff like vim-dim let’s you go one step further if you want.)
When you're wondering why Emacs chose poor colors for something, it's often frame-background-mode being wrong.
[0]https://doc.endlessparentheses.com/Var/frame-background-mode...
For dark-background terminals with white text:
For light-background terminals with black text:png file: https://drive.google.com/file/d/1mkMESeGf7MNdKa-rPDx7Yf9BDit...
imgur link: https://imgur.com/a/flatui-7mqVZAY
Based on: https://flatuicolors.com/palette/defo
I've been using mine for about a decade too. It works well for iTerm, vim, Emacs, vscode etc etc
However, Apple have languished with their Terminal support, they don't to >256 colors and some of the other more modern stuff is lacking and it doesn't really work with a Neovim+LazyVim setup.
I've been trying to find a "better" terminal and have bounced around between iTerm2, Kitty, Alacritty and Wezterm, but while they all are more "modern", I find that none of them seem to have that basic "New Window with Profile ..." option that lets me quickly open windows with different background colors/themes (at least without some screwing around).
Currently settled on Wezterm, mostly because it also works on Windows and I can share my wezterm.lua configuration (I should note that Windows Terminal is actually pretty good too). I still do find my self running Apple Terminal for quick things (e.g. using python3 as a REPL to do math or testing hex/binary stuff out etc).
iTerm has exactly that.
There are a few things I miss from iTerm2 (mostly mouse related), but otherwise it took me a few evenings to configure it to my liking (cmd-n opens a new window at the default dir, not the current one) and I've been a happy user since.
1. https://wezfurlong.org/wezterm/config/lua/config/launch_menu...
2. https://wezfurlong.org/wezterm/config/lua/window-events/augm...
Yeah, it takes some screwing around, but programming extremely specific features just the way you want them is peak WezTerm experience.