Configuring shell colours
Whilst moving my development environment to WSL2, I noticed that the default shell colours for listing files made the text hard to read due to poor contrast. So I went about finding a way to change those defaults.
This guide was written using Ubuntu via WSL2.
First let's look at our current output of ls -la
.
Here we can see the a_directory
directory is presented with a
yellow and background and black text.
LS_COLORS
The ls
program reads from the LS_COLORS
variable to determine
how the filenames will be displayed in the terminal. This variable
can be set using the dircolors
program. You can read more about
it on its man page.
The LS_COLORS
variable can be set directly, but for the purpose
of this guide we'll be using dircolors
. Here's a solution
for using LS_COLORS
directly.
Creating our dircolors config file
We can save the output of the dircolors
program to create a
config file.
dircolors -p > $HOME/.dircolors
We call run the dircolors
program with the -p
flag which is
short for --print-database
. This will give us a list of
currently configured settings, and we write the output to our
config file .dircolors
.
Here we save the file in our home directory, but you can save yours in whatever location you prefer.
We want our shell to load our new config instead of loading the
default. Let's add some code to our .bashrc
(or .zshrc
if
you're using zsh like I am) that will run on startup.
# dircolors - load config for ls colors
dircolors_config=$HOME/.dircolors
test -r $dircolors_config && eval "$(dircolors $dircolors_config)"
This snippet checks for the existence of a file .dircolors
in
the home directory, be sure to point yours to the location you
saved it if you chose another location. It then passes that file
as an argument to the dircolors
program which sets the
LS_COLORS
variable.
Setting colours
Open the .dircolors
file in your preferred text editor. We have
some comments describing each section, and we can see some colour
code definitions we can use to customise it ourselves.
If we want to set the background colour for a directory to white, first we find the existing statement and make our changes. In my case it's set to yellow.
DIR 30;43
Let's change the background from yellow to white.
DIR 30;47
And the text colour from black to red
DIR 31;47
The syntax represents the following entities separated by a semicolon in the following order.
- DIR - we're setting a color for directories
- 31 - the text color code, which is set to red
- 47 - the background color code, which is set to white
Let's load our new config by using the source
program.
source ~/.zshrc
When we now run ls -la
the colour of directories should have now
changed.
There we have it! How to customise the output of ls
without any
extra tools or themes. Experiment and customise to your hearts
content.