This plugin enables vim to follow the global system-wide dark mode preference of your platform.
Supported platforms are Linux, MacOS and Windows. All platform implementations are interrupt-based and do not use any resources in the background because they avoid polling and use the proper system APIs instead.
With vim-plug
add the following line to your .vimrc
:
Plug 'vimpostor/vim-lumen'
Once a system dark mode preference change is detected, this plugin will set the background
vim option accordingly, so make sure that your colorscheme supports reloading as described in :h 'background'
.
On Linux it is required that you have gdbus
installed together with one of the following options:
Make sure that the xdg-desktop-portal
is running.
It is required that Swift is available on your system. Swift is shipped with Xcode for example.
At least Windows 10 1903 is required. No further installed components are needed. This also works inside WSL2.
You can use the LumenLight
and LumenDark
User
autocommands:
au User LumenLight echom 'Entered light mode'
au User LumenDark echom 'Entered dark mode'
Note that for the common usecase of switching the colorscheme, there are the g:lumen_light_colorscheme
and g:lumen_dark_colorscheme
variables.
There are not many colorschemes that work well both in light and dark mode. Here are some example colorschemes that I can personally recommend:
retrobox
from the default Vim colorschemesNeovim recently merged support for SIGWINCH autocmds. It is possible to hack together dark mode support by abusing the SIGWINCH
autocmd, but this has quite a few disadvantages:
SIGWINCH
when the system-wide dark mode preference changes. At the moment, pretty much no terminal supports this besides iTerm
SIGWINCH
event is fired regularly for other events. For example while resizing the window, SIGWINCH
can be emitted many times per second, which causes performance issues due to checking the system dark mode preference multiple times per secondSIGWINCH
is not really intended for this usecase at all. You are abusing a signal that is originally only meant to be fired when the terminal size changesSIGWINCH
support in neovim
, whereas this plugin also supports regular vim