{ lib, config, ... }: { config = { frogeye = { # TODO Move to relevant config file. Rest can probably removed. direnv = { CARGOHOME = "${config.xdg.cacheHome}/cargo"; # There are config in there that we can version if one want DASHT_DOCSETS_DIR = "${config.xdg.cacheHome}/dash_docsets"; GRADLE_USER_HOME = "${config.xdg.cacheHome}/gradle"; MIX_ARCHIVES = "${config.xdg.cacheHome}/mix/archives"; MONO_GAC_PREFIX = "${config.xdg.cacheHome}/mono"; PARALLEL_HOME = "${config.xdg.cacheHome}/parallel"; TERMINFO = "${config.xdg.configHome}/terminfo"; WINEPREFIX = "${config.xdg.stateHome}/wineprefix/default"; }; junkhome = [ "adb" "audacity" "cabal" # TODO May have options but last time I tried it it crashed "itch" "simplescreenrecorder" # Easy fix https://github.com/MaartenBaert/ssr/blob/1556ae456e833992fb6d39d40f7c7d7c337a4160/src/Main.cpp#L252 "vd" "wpa_cli" # TODO Maybe we can do something about node-gyp ]; }; home = { activation.createDirenvFolders = lib.hm.dag.entryAfter [ "writeBoundary" ] (lib.strings.concatLines (map (d: "mkdir -p ${d}") ( (builtins.attrValues config.frogeye.direnv) ++ [ "${config.xdg.cacheHome}/junkhome" ] ))); sessionVariables = config.frogeye.direnv; }; programs.bash.shellAliases = lib.attrsets.mergeAttrsList (map (p: { "${p}" = "HOME=${config.xdg.cacheHome}/junkhome ${p}"; }) config.frogeye.junkhome); }; options.frogeye = { direnv = lib.mkOption { default = { }; example = lib.literalExpression '' { DASHT_DOCSETS_DIR = "''${config.xdg.cacheHome}/dash_docsets"; } ''; description = '' Environment variables for which the value is a folder that will be automatically created. Useful for keeping programs data out of $HOME for programs that won't create the directory themselves. ''; type = lib.types.attrsOf lib.types.str; }; junkhome = lib.mkOption { default = [ ]; description = '' Program names that will be run with a different HOME so they don't clutter the real one. Useful for programs that don't follow the XDG specification and tend to advertise themselves. ''; type = lib.types.listOf lib.types.str; }; # TODO Should make a nix package wrapper instead, so it also works from dmenu }; }