I’ve been spending more time at the pool lately (sorry, not sorry) and I’ve
found myself manually switching between a light and a dark
This was all well and good, but my
set background=dark so
regardless of which theme I’m using in the terminal,
vim has a dark
Searched a far and wide on the interwebs and I couldn’t find a decent solution.
Most of the tips were outdated and relied on deprecated technologies (e.g.
gconf) and everything else just wasn’t quite enough to run inside of
Determined, I set out to write a solution that would tell
vim the current
background color and then use said value to dynamically set the background color
Just for reference, I use the Solarized color scheme and toggle between the light and dark versions.
As mentioned, I also use
gnome-terminal so YMMV on other terminals.
The star of the show is an app called
xtermcontrol that can return the
background color of your terminal. The problem is, once you’re inside of
you can’t use the command because it can’t figure out what your terminal is.
I read that you could simply run an escape code to return the value so
xtermcontrol isn’t necessarily a hard dependency. With that, I couldn’t make
heads or tails on how to pull that off, so I am relying on
Before I get into the code, let me give you a high level overview of what I’m doing.
First, I created a
vim function that serves as an alias to
The alias runs
xtermcontrol --get-bg which gets the background color and then
uses said value to pass
--cmd argument to set a
.vimrc I check that
theme exists and if it’s set to
light. If it
set background=light otherwise fallback to the dark theme.
One gotcha I noticed is that when I run
git commit I always end up with a dark
vim. Assumption is it’s because
git is running
differently and it’s completely bypassing my alias function.
Simply put, it wasn’t a big enough deal for me to get it fixed.
Feel free to send me a PR if you know how to get shit working ;)
So now you know the gist of what I was trying to accomplish, and here’s the code:
zsh but this outta work well in
bash and I make zero claims about
whether or not this would work in
fish or any other shells.
Depending on your theme’s background color, you will need to adjust
rgb:0000/2b2b/3636 to be whatever your dark theme’s background color is.
You can get that value by running
In the aforementioned alias, I pass a
--cmd that sets the
theme value that
we can interrogate inside of the
if exists('theme') && theme == 'light' set background=light else set background=dark endif
Worked well enough for me. Next time I’m at the pool and I switch to Solarized
light in the terminal,
vim should adjust accordingly.
Probably should figure out how to switch my terminal profile with a command instead of that pesky right-click, going to profiles and then selecting my theme.
Better still, wonder if I could tap into the ambient light sensor and do this all automagically O_O
Happy hacking folks, and remember that I keep all of my dotfiles out on GitHub* ready for some serious forking!
- For now at least, we’ll see how this Microsoft acquisition goes ;)