tl;dr: To set dircolors/LS_COLORS in a NixOS fashion I had to set the configuration.nix property programs.bash.enableLsColors to false so that it would honor the value I put into programs.bash.interactiveShellInit where I specify the value I want because the behind-the-scenes magic for NixOS clobbers that degree of user customization.
I typically customize my console color output for ls extensively. And by extensively I facetiously mean I set the color of directories in the ls output and absolutely nothing else. I feel blue on black may as well be black on black. So I set them to white. This is pretty terrible with a white background terminal, but excellent on a black or otherwise dark terminal background.
I wanted to set this on my NixOS systems, but instead of building up dot-files that I have to carry around and maintain and synchronize, I wanted to do it in a more NixOS fashion and put it in my configuration.nix file.
I first went looking to see if there was an explicit way to do this. I managed to find a web resource for finding configuration values.
Almost anything you would want to see is available in man configuration.nix and via the vim Man plugin you can pull that up as you edit the configuration. But an additional tidbit from the web resource is that you can view the nix file associated with the configuration option. Now, the man page also shows what nix file has the configuration information, but other than a really slow find across my entire system, I don’t know how to find that damn file yet.
For example:
find / -name ls-colors.nix 2>/dev/null /nix/store/3idd0nvfl44p735nhzhgxhfkgj0a4d1v-nixos/modules/programs/bash/ls-colors.nix /nix/store/nkybb8l4qxg79zh7gdwgvl0xxa7fgl85-nixos-23.05/nixos/nixos/modules/programs/bash/ls-colors.nix /nix/store/izx0xzqxdbfhjhnfix3f0v039av7224w-nixos/modules/programs/bash/ls-colors.nix
So I used that web resource to click directly on the entry and immediate gratification is my reward. I see the following:
{ config, lib, pkgs, ... }: with lib; let enable = config.programs.bash.enableLsColors; in { options = { programs.bash.enableLsColors = mkEnableOption (lib.mdDoc "extra colors in directory listings") // { default = true; }; }; config = mkIf enable { programs.bash.promptPluginInit = '' eval "$(${pkgs.coreutils}/bin/dircolors -b)" ''; }; }
My attention immediately focused on the weird config = mkIf enable block. Specifically:
eval "$(${pkgs.coreutils}/bin/dircolors -b)"
I immediately thought it was going to be a problem, but I didn’t fully believe it. I also noticed that enableLsColors is enabled by default. So the result is, I imagine, that if you go with the defaults, you cannot set the LS_COLORS via your configuration.nix file.
I tried to put my custom LS_COLORS value into the programs.bash.interactiveShellInit (I already set -o vi in there) to see if it would honor my custom colors.
That now looks like this:
programs.bash.interactiveShellInit = "set -o vi; export LS_COLORS='rs=0:di=01;37:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.swp=00;90:*.tmp=00;90:*.dpkg-dist=00;90:*.dpkg-old=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:'; ";
I did a nixos-rebuild switch and opened a new terminal. Sure enough, when I typed ls I saw barely visible blue directories instead of white. So I went back in and disabled the use of LS_COLORS via the configuration. That is, I added this:
programs.bash.enableLsColors = false;
I did another nixos-rebuild switch and opened a new terminal. The output of ls is now clearly visible white directory names.
I should probably go find a community of NixOS users now to ask about stuff like this.
updated: 2023-11-05 17:25:29
generated: 2024-06-17