{ config, lib, pkgs, ... }: let inherit (pkgs) stdenv; lsOptions = if stdenv.isDarwin then "-p" else "-v --group-directories-first"; lsIsoDate = if stdenv.isDarwin then "" else "--time-style=long-iso"; zshrc = ".config/zsh/.zshrc"; mkZshPlugin = attrs: { name = attrs.name; src = stdenv.mkDerivation { inherit (attrs) src; name = "zsh-plugin-${attrs.name}"; buildInputs = [ pkgs.zsh ]; buildPhase = '' zsh -c 'for f in **/*; zcompile "$f"' ''; installPhase = '' cp -a $PWD $out/ ''; }; }; in { home.packages = with pkgs; [ fzf ghq git git-lfs zsh-completions ]; home.activation.linkOldZshHistory = config.lib.dag.entryAfter ["writeBoundary"] '' if [[ ! -f ''${XDG_DATA_HOME}/zsh/history ]]; then mkdir -p ''${XDG_DATA_HOME}/zsh/ ln ~/.cache/zsh/history ''${XDG_DATA_HOME}/zsh/history fi ''; programs.zsh = { enable = true; enableAutosuggestions = true; enableCompletion = true; defaultKeymap = "emacs"; dotDir = ".config/zsh"; history = { expireDuplicatesFirst = true; extended = true; path = "\${XDG_DATA_HOME#$HOME/}/zsh/history"; save = 20000; size = 10000; share = false; }; localVariables = { ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE = "fg=8"; }; plugins = (map mkZshPlugin [ { name = "cd-gitroot"; src = pkgs.fetchFromGitHub { owner = "mollifier"; repo = "cd-gitroot"; rev = "a1d59511eba2b99935635b2efef00f8d2363aecd"; # date = 2016-03-23T18:29:15+09:00; sha256 = "1l0fb24vcgd7vgya1r47h2bfczkxrb3mxn791l305f5d350wvqfz"; }; } { name = "calc"; src = pkgs.fetchFromGitHub { owner = "arzzen"; repo = "calc.plugin.zsh"; rev = "ea59bc2bfd1d2791de539c31c0c544d4dc16dad6"; # date = 2020-02-05T09:22:01+00:00; sha256 = "0as30w1na8idrkxifim44ky0521r93r2qm201qnnl6by2qbmbiqv"; }; } { name = "zsh-nix-shell"; src = pkgs.fetchFromGitHub { owner = "chisui"; repo = "zsh-nix-shell"; rev = "69e90b9bccecd84734948fb03087c2454a8522f6"; # date = 2020-04-08T00:11:55+02:00; sha256 = "0snhch9hfy83d4amkyxx33izvkhbwmindy0zjjk28hih1a9l2jmx"; }; } { name = "you-should-use"; src = pkgs.fetchFromGitHub { owner = "MichaelAquilina"; repo = "zsh-you-should-use"; rev = "888da3af69162c927e0f933ab8dc12395a52ad67"; # date = 2020-01-19T20:28:40+00:00; sha256 = "1gcxm08ragwrh242ahlq3bpfg5yma2cshwdlj8nrwnd4qwrsflgq"; }; } { name = "agkozak-zsh-prompt"; src = pkgs.fetchFromGitHub { owner = "agkozak"; repo = "agkozak-zsh-prompt"; rev = "83ec46e7d0af4b7aef64919ed3551d7da789436c"; # date = 2020-01-24T19:54:05-08:00; sha256 = "0kq7qvwkbkx18k4wxcnc76xnsrfn32k8dykvrsmmz8y9f81zhnpz"; }; } { name = "anyframe"; src = pkgs.fetchFromGitHub { owner = "mollifier"; repo = "anyframe"; rev = "598675303044df8e9d04722f3adff4f63a238922"; # date = 2017-07-19T21:59:49+09:00; sha256 = "08bjm1dd2mpv8rk8x6yvm6gj490rgimmiq7ln4jr5hik2k3mm82r"; }; } ] ++ lib.optionals stdenv.isDarwin [ { name = "tumult"; src = pkgs.fetchFromGitHub { owner = "unixorn"; repo = "tumult.plugin.zsh"; rev = "e74db60be21dfebaa89b84fb9a45939814573c8c"; # date = 2019-03-07T08:53:24-07:00; sha256 = "1328g3h51478ai25niv9qgf8bjgg3cw98zdqfznrbgw0k3qj66zk"; }; } ]); shellAliases = { l = "ls ${lsOptions} -Bp"; l1="ls -1"; ls="ls ${lsOptions} -hF"; la="ls ${lsOptions} -hA"; ll="ls ${lsOptions} ${lsIsoDate} -hl"; lal="ll -A"; lla="lal"; llr="ll -t"; cg = "cd-gitroot"; cdg = "cd-gitroot"; https = "http --default-scheme https"; history = "fc -l $(( $LINES - 2 ))"; hist-freq-lines = "fc -l -10000 | cut -d' ' -f4- | sort | uniq -c | sort -g | tail -n100 | less"; hist-freq-commands = "fc -l -10000 | cut -d' ' -f4 | sort | uniq -c | sort -g | tail -n10 | less"; wprop = "xprop | egrep '^WM_(CLASS|NAME|WINDOW_ROLE|TYPE)'"; # Enable the following commands to support aliases. sudo = "sudo "; watch = "watch "; d = "docker"; db = "docker build"; dr = "docker run"; di = "docker image"; dj = "docker pull"; dk = "docker push"; dcb = "dc build"; dcd = "dc down"; dcj = "dc pull"; dck = "dc push"; dcl = "dc logs"; dclf = "dc logs -f"; dcu = "dc up"; dcud = "dc up -d"; dcr = "dc restart"; g = "rg"; ga = "git add"; gs = "git st"; gd = "git diff"; gf = "git fetch"; gk = "git push"; gkf = "git push --force-with-lease"; gj = "git pull"; gl = "git lg"; gm = "git merge"; ge = "git remote"; gr = "git rebase"; gz = "git stash"; gls = "git ls-files"; gzl = "git stash list"; gzp = "git stash pop"; gdt = "git difftool"; grl = "git reflog"; gri = "git rebase --interactive"; gfa = "git fetch --all"; grs = "git reset"; grsh = "git reset --hard"; gsh = "git show"; gsm = "git submodule"; gci = "git commit"; gx = "git restore"; gb = "git switch"; gbr = "git br"; gbrc = "git checkout -b"; gbrd = "git branch --delete"; gbrm = "git branch --move"; gmup = "git mup"; grup = "git rup"; hos = "home-manager switch"; hon = "home-manager news"; hoh = "home-manager-help"; nic = "nix-channel"; nica = "nix-channel --add"; nicl = "nix-channel --list"; nicu = "nix-channel --update"; nicr = "nix-channel --remove"; nicb = "nix-channel --rollback"; snic = "sudo nix-channel"; snica = "sudo nix-channel --add"; snicl = "sudo nix-channel --list"; snicu = "sudo nix-channel --update"; snicr = "sudo nix-channel --remove"; snicb = "sudo nix-channel --rollback"; n = "nix-env"; ni = "nix-env -iA"; nq = "nix-env -q"; ne = "nix-env -e"; nup = "nix-env -u"; nlg = "nix-env --list-generations"; snlg = "sudo nix-env --list-generations --profile /nix/var/nix/profiles/system"; ngc = "nix-collect-garbage --delete-older-than 14d"; sngc = "sudo nix-collect-garbage --delete-older-than 14d"; }; envExtra = '' if [[ ''${path[(I)$HOME/.local/bin ]} ]] then path=($HOME/.local/bin $path) fi if [[ ''${path[(I)$HOME/go/bin ]} ]] then path+=($HOME/go/bin) fi ''; initExtra = '' typeset -T GHQ_ROOT ghq_root export GHQ_ROOT="$HOME/projects:$HOME/go/src:$HOME/quicklisp/local-projects" function hist-freq-subcommands () { fc -l -m "$1*" -10000 | cut -d' ' -f4- | sort | uniq -c | sort -g | tail -n100 | less } source ${pkgs.fzf}/share/fzf/key-bindings.zsh '' + builtins.readFile ../zsh/zshrc; }; home.file."${zshrc}".onChange = "${pkgs.zsh}/bin/zsh -i -c 'autoload -Uz compinit && compinit && zcompile ${zshrc}'"; }