Clean Home
May 17, 2021 — Reyan Chaudhry
If you are genuinely insane like me, you may find that having “clean” directory names/structures and no dotfiles in your home directory gives you a sense of power, makes you feel as if you have something to be proud of. If so, here is a guide on achieving this relatively maniacal goal with minimal (ok that’s a lie) difficulty.
On a side note, the reason I’m putting actual effort into this is that
vizs seems to have
(sensibly, mind you) given up on maintaining his
declutter-home
repo, which was basically the bible for us
clean home enthusiasts.
Fear not, however! As I plan on providing a sane, expanded, and updated replacement to said README in this article.
The Easy Stuff
Lets get some of the more obedient software out of the way first, shall
we? Your shell is probably what triggers you most when it comes to
dotfiles, and bash
is infamous for littering your home
directory with trash. Unfortunately, however, nothing can be done to save
our fellow bash users, switch to zsh/mksh
or bust lmfao.
For us intellectuals, setting the env var ZDOTDIR
in
/etc/zsh/zshenv
and then putting all our necessary
zsh
files in the specified directory should be satisfactory.
Note, however, that you can choose a custom ZSHRC
file as
well, should you desire that.
What’s next is probably the most crucial step here, setting XDG env vars. Here are the 3 you really need to know:
XDG_CONFIG_HOME
, normally~/.config
XDG_DATA_HOME
, normally~/.local/share
XDG_CACHE_HOME
, normally~/.cache
Most programs should begin to adhere to these new standards after
a couple restarts, a good practice is to simply dump everything you have
in ~/.config
or such straight into your newly desired
directory and keep track of which programs break. Remember those as we
will need them later.
Here’s where we get to spamming env vars for programs that don’t normally obey XDG, specifications, some important ones being:
Program | Env Var |
---|---|
dialog | DIALOGRC |
GIMP | GIMP2_DIRECTORY |
gnupg | GNUPGHOME |
readline | INPUTRC |
less | LESSHISTFILE |
MAIL / MAILRC |
|
go | GOBIN / GOPATH |
pass | PASSWORD_STORE_DIR |
pulseaudio [1] | PULSE_COOKIE |
python [2] | PYTHONUSERBASE |
shell-history | HISTFILE |
cargo | CARGO_HOME |
rustup | RUSTUP_HOME |
weechat | WEECHAT_HOME |
As an aside, you can set custom PATH
’s to house your scripts
and such wherever you’d like, ridding the need for
.local
entirely
Xorg
Another massive pain in the home dir’s ass is X
and all the
bullshit that it likes to dump there. The problem is magnified once you
realize how annoying Xorg is when it comes to fixing it using it’s built
in settings. What’s normally used to start X
display servers
is the startx
script, which is old, inefficient, and bloated.
It’s recommended to instead use
sx and modify that to your
needs instead (lines 25, 26 and 29). sx
will start an Xorg
instance as normal and save you many headaches.
ssh
More info soon.
npm
npm
is a bit less straightforward than it’s equally soy yet
slightly more bearable python cousin, there a couple extra steps involved.
First and foremost, set the npm_config_userconfig
env var to
a specific file. This file will be the per-user
npm
configuration file. Next, run
npm config edit
To open up your config. Go to the line with the cache
option
and set it to whatever directory you’d like. What you choose will be used
instead of the normal ~/.npm
. It will still dump the
package-lock
shit in your home whenever you decide to install
something, but at least those can be removed manually without any worries.
Worth the slight inconvenience IMO.
Flags
Now that we’re done with environment related stuff, let’s get to the fun part, manually defining flags! Quite a few programs have these, with the following being some of the more relevant ones:
Program | Flag |
---|---|
dunst | -conf |
picom | --config |
sxhkd | -c |
wget | --no-hsts / --hists-file |
As you can see, most programs use some variation of c/config/conf to point
at a specific config file. Laying out all possible programs and variations
here would be pointless, as the list varies from user to user. Just check
the man
page of the desired program and search for
‘directory’ or ‘config’ and the like, you’ll find what you are looking for
eventually.
Patching
Of course, most smaller programs (or those which you don’t expect to be
updated anytime soon) can be manually patched to adhere to yours’ (or
XDG’s) specified directory requirements. Ample use of grep
,
sed
, and Vim substitution can make this task trivial, just be
careful not to mess things up. And obviously, submitting PR’s to make
things easier for others in the future would never hurt.
Homedir Roomba
You can use a roomba script to automatically remove certain pesky directories (such as Thunar’s constant caching of image thumbnails) every 60 seconds or such. This removes the need to constantly check for and manually delete said directories.
Conclusion
I’ve reasonably left out too many specifics in this post, as the vast variety of software on Linux makes it hard to account for everything, but I hope you’ve gotten the gist of how to manage a clean home on your own. It’s not too difficult and genuinely allows you to have a better overlook of your system and to manage it more effectively. All opinions expressed here, are, of course, subjective and my own.
Big thanks to vizs, gk, and others who worked on this before me and inspired me to write this.
Have a good day.