Counterintuitive Configuration for Bash Colors in NixOS
tl;dr: To set T383838dircolors/T383838LS_COLORS in a NixOS fashion I had to set the T383838configuration.nix property T383838programs.bash.enableLsColors to T383838false so that it would honor the value I put into T383838programs.bash.interactiveShellInit where I specify the value I want because the behind-the-scenes magic for NixOS clobbers that degree of user customization.
the journey
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 T383838configuration.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.
a quick aside
Almost anything you would want to see is available in T383838man configuration.nix and via the vim T383838Man 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
back to the story
So I used that web resource to click directly on the entry and immediate gratification is my reward. I see the following:
T282828
Tb4b4b4{ configTb4b4b4, libTb4b4b4, pkgsTb4b4b4, Tff7b72.Tff7b72.Tff7b72. Tb4b4b4}Tb4b4b4:
Tff7b72with libTb4b4b4;
Tff7b72let
Ta5d6ffenable Tff7b72= configTff7b72.programsTff7b72.bashTff7b72.enableLsColorsTb4b4b4;
Tff7b72in
Tb4b4b4{
Ta5d6ffoptions Tff7b72= Tb4b4b4{
programsTff7b72.bashTff7b72.Ta5d6ffenableLsColors Tff7b72= mkEnableOption Tb4b4b4(libTff7b72.mdDoc Ta5d6ff"Ta5d6ffextra colors in directory listingsTa5d6ff"Tb4b4b4) Tff7b72// Tb4b4b4{
Ta5d6ffdefault Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Ta5d6ffconfig Tff7b72= mkIf enable Tb4b4b4{
programsTff7b72.bashTff7b72.Ta5d6ffpromptPluginInit Tff7b72= Ta5d6ff''
Ta5d6ff eval "Ta5d6ff$(Tffd700${pkgsTff7b72.coreutilsTffd700}Ta5d6ff/bin/dircolors -b)"
Ta5d6ff''Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
My attention immediately focused on the weird T383838config = mkIf enable block. Specifically:
T282828
eval Ta5d6ff"Ta5d6ff$(Tffd700${pkgsTff7b72.coreutilsTffd700}Ta5d6ff/bin/dircolors -b)Ta5d6ff"
I immediately thought it was going to be a problem, but I didn't fully believe it. I also noticed that T383838enableLsColors is enabled by default. So the result is, I imagine, that if you go with the defaults, you cannot set the T383838LS_COLORS via your T383838configuration.nix file.
I tried to put my custom T383838LS_COLORS value into the T383838programs.bash.interactiveShellInit (I already T383838set -o vi in there) to see if it would honor my custom colors.
That now looks like this:
T282828
programsTff7b72.bashTff7b72.Ta5d6ffinteractiveShellInit Tff7b72= Ta5d6ff"Ta5d6ffset -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:'; Ta5d6ff"Tb4b4b4;
I did a T383838nixos-rebuild switch and opened a new terminal. Sure enough, when I typed T383838ls I saw barely visible blue directories instead of white. So I went back in and disabled the use of T383838LS_COLORS via the configuration. That is, I added this:
T282828
programsTff7b72.bashTff7b72.Ta5d6ffenableLsColors Tff7b72= Tff7b72falseTb4b4b4;
I did another T383838nixos-rebuild switch and opened a new terminal. The output of T383838ls is now clearly visible white directory names.
I should probably go find a community of NixOS users now to ask about stuff like this.
Tags: nixos, index, cli
Tags
Navigation