{ pkgs, config, lib, ... }: let direnv = { # Environment variables making programs stay out of $HOME, but also needing we create a directory for them CARGOHOME = "${config.xdg.cacheHome}/cargo"; # There are config in there that we can version if one want CCACHE_DIR = "${config.xdg.cacheHome}/ccache"; # The config file alone seems to be not enough DASHT_DOCSETS_DIR = "${config.xdg.cacheHome}/dash_docsets"; GOPATH = "${config.xdg.cacheHome}/go"; GRADLE_USER_HOME = "${config.xdg.cacheHome}/gradle"; MIX_ARCHIVES = "${config.xdg.cacheHome}/mix/archives"; MONO_GAC_PREFIX = "${config.xdg.cacheHome}/mono"; npm_config_cache = "${config.xdg.cacheHome}/npm"; PARALLEL_HOME = "${config.xdg.cacheHome}/parallel"; TERMINFO = "${config.xdg.configHome}/terminfo"; WINEPREFIX = "${config.xdg.stateHome}/wineprefix/default"; YARN_CACHE_FOLDER = "${config.xdg.cacheHome}/yarn"; # TODO Some of that stuff is not really relavant any more }; dotfilesPath = "$HOME/.dotfiles"; # FIXME I think we want it in ~/.config/dotfiles, also, should be an option in { programs = let commonRc = lib.strings.concatLines ([ '' # Colored ls # TODO Doesn't allow completion _colored_ls() { \ls -lh --color=always $@ | awk ' BEGIN { FPAT = "([[:space:]]*[^[:space:]]+)"; OFS = ""; } { $1 = "\033[36m" $1 "\033[0m"; $2 = "\033[31m" $2 "\033[0m"; $3 = "\033[32m" $3 "\033[0m"; $4 = "\033[32m" $4 "\033[0m"; $5 = "\033[31m" $5 "\033[0m"; $6 = "\033[34m" $6 "\033[0m"; $7 = "\033[34m" $7 "\033[0m"; print } ' } alias ll="_colored_ls" alias la="_colored_ls -a" '' ] ++ map (d: "mkdir -p ${d}") (builtins.attrValues direnv)); commonSessionVariables = { TIME_STYLE = "+%Y-%m-%d %H:%M:%S"; # Less colors LESS = "-R"; LESS_TERMCAP_mb = "$'\E[1;31m'"; # begin blink LESS_TERMCAP_md = "$'\E[1;36m'"; # begin bold LESS_TERMCAP_me = "$'\E[0m'"; # reset bold/blink LESS_TERMCAP_so = "$'\E[01;44;33m'"; # begin reverse video LESS_TERMCAP_se = "$'\E[0m'"; # reset reverse video LESS_TERMCAP_us = "$'\E[1;32m'"; # begin underline LESS_TERMCAP_ue = "$'\E[0m'"; # reset underline # Fzf FZF_COMPLETION_OPTS = "${lib.strings.concatStringsSep " " config.programs.fzf.fileWidgetOptions}"; }; commonShellAliases = { cp = "cp -i --reflink=auto"; grep = "grep --color=auto"; dd = "dd status=progress"; rm = "rm -v --one-file-system"; free = "free -m"; diff = "diff --color=auto"; dmesg = "dmesg --ctime"; wget = "wget --hsts-file ${config.xdg.cacheHome}/wget-hsts"; }; historySize = 100000; historyFile = "${config.xdg.cacheHome}/shell_history"; in { home-manager.enable = true; bash = { enable = true; bashrcExtra = lib.strings.concatLines [ commonRc '' shopt -s expand_aliases shopt -s histappend '' ]; sessionVariables = commonSessionVariables; historySize = historySize; historyFile = historyFile; historyFileSize = historySize; historyControl = [ "erasedups" "ignoredups" "ignorespace" ]; shellAliases = commonShellAliases; }; zsh = { enable = true; enableAutosuggestions = true; enableCompletion = true; enableSyntaxHighlighting = true; # syntaxHighlighting.enable = true; # 23.11 syntax historySubstringSearch.enable = true; initExtra = lib.strings.concatLines [ commonRc (builtins.readFile ./zshrc.sh) ]; defaultKeymap = "viins"; history = { size = historySize; save = historySize; path = historyFile; expireDuplicatesFirst = true; }; sessionVariables = commonSessionVariables; shellAliases = commonShellAliases; }; dircolors = { enable = true; enableBashIntegration = true; enableZshIntegration = true; # UPST This thing put stuff in .dircolors when it actually doesn't have to }; powerline-go = { enable = true; modules = [ "user" "host" "venv" "cwd" "perms" "git" ]; modulesRight = [ "jobs" "exit" "duration" "load" ]; settings = { colorize-hostname = true; max-width = 25; cwd-max-dir-size = 10; duration = "$( test -n \"$__TIMER\" && echo $(( $EPOCHREALTIME - $\{__TIMER:-EPOCHREALTIME})) || echo 0 )"; # UPST Implement this properly in home-manager, would allow for bash support }; extraUpdatePS1 = ''unset __TIMER''; }; # neovim = { # enable = true; # defaultEditor = true; # vimAlias = true; # viAlias = true; # vimdiffAlias = true; # }; # FIXME Still want this despite using nixvim gpg = { enable = true; homedir = "${config.xdg.stateHome}/gnupg"; settings = { # Remove fluff no-greeting = true; no-emit-version = true; no-comments = true; # Output format that I prefer keyid-format = "0xlong"; # Show fingerprints with-fingerprint = true; # Make sure to show if key is invalid # (should be default on most platform, # but just to be sure) list-options = "show-uid-validity"; verify-options = "show-uid-validity"; # Stronger algorithm (https://wiki.archlinux.org/title/GnuPG#Different_algorithm) personal-digest-preferences = "SHA512"; cert-digest-algo = "SHA512"; default-preference-list = "SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed"; personal-cipher-preferences = "TWOFISH CAMELLIA256 AES 3DES"; }; publicKeys = [{ source = builtins.fetchurl { url = "https://keys.openpgp.org/vks/v1/by-fingerprint/4FBA930D314A03215E2CDB0A8312C8CAC1BAC289"; sha256 = "sha256:10y9xqcy1vyk2p8baay14p3vwdnlwynk0fvfbika65hz2z8yw2cm"; }; trust = "ultimate"; }]; }; fzf = { enable = true; enableZshIntegration = true; defaultOptions = [ "--height 40%" "--layout=default" ]; fileWidgetOptions = [ "--preview '[[ -d {} ]] && ls -l --color=always {} || [[ \$(file --mime {}) =~ binary ]] && file --brief {} || (highlight -O ansi -l {} || coderay {} || rougify {} || cat {}) 2> /dev/null | head -500'" ]; }; # TODO highlight or bat nix-index = { enable = true; enableZshIntegration = true; }; less.enable = true; }; home = { stateVersion = "23.05"; language = { base = "en_US.UTF-8"; time = "en_DK.UTF-8"; }; packages = with pkgs; [ # dotfiles dependencies coreutils bash gnugrep gnused gnutar openssl git wget curl python3Packages.pip ansible # TODO Reevaluate # shell zsh-completions nix-zsh-completions zsh-history-substring-search antigen # TODO Reevaluate powerline-go # terminal essentials moreutils man visidata nodePackages.insect translate-shell unzip unrar p7zip # remote openssh rsync borgbackup # cleanup ncdu jdupes duperemove optipng libjpeg # FIXME reflac not available (but also a dumb shell script) # local monitoring htop iotop iftop lsof strace pv progress speedtest-cli # multimedia toolbox ffmpeg sox imagemagick # password pass pwgen # Mail isync msmtp notmuch neomutt lynx # Organisation vdirsyncer khard khal todoman syncthing ]; sessionVariables = { # Favourite commands PAGER = "${pkgs.coreutils}/bin/less"; EDITOR = "${pkgs.neovim}/bin/nvim"; VISUAL = "${pkgs.neovim}/bin/nvim"; BROWSER = "${config.programs.qutebrowser.package}/bin/qutebrowser"; } // direnv // { BOOT9_PATH = "${config.xdg.dataHome}/citra-emu/sysdata/boot9.bin"; CCACHE_CONFIGPATH = "${config.xdg.configHome}/ccache.conf"; INPUTRC = "${config.xdg.configHome}/inputrc"; LESSHISTFILE = "${config.xdg.stateHome}/lesshst"; NODE_REPL_HISTORY = "${config.xdg.cacheHome}/node_repl_history"; PYTHONSTARTUP = "${config.xdg.configHome}/pythonstartup.py"; RXVT_SOCKET = "${config.xdg.stateHome}/urxvtd"; # Used to want -$HOME suffix, hopefullt this isn't needed SCREENRC = "${config.xdg.configHome}/screenrc"; SQLITE_HISTFILE = "${config.xdg.stateHome}/sqlite_history"; YARN_DISABLE_SELF_UPDATE_CHECK = "true"; # This also disable the creation of a ~/.yarnrc file # XAUTHORITY = "${config.xdg.configHome}/Xauthority"; # Disabled as this causes lock-ups with DMs }; # TODO Session variables only get reloaded on login I think. sessionPath = [ "$HOME/.local/bin" "${config.home.sessionVariables.GOPATH}" "${dotfilesPath}/config/scripts" ]; }; }