{ config, lib, pkgs, inputs, ... }: { # configure z-shell to use omz with some plugins programs.zsh = { enable = true; autosuggestion.enable = true; syntaxHighlighting.enable = true; oh-my-zsh = { enable = true; # add git and agents as plugins plugins = [ "git" "ssh-agent" "gpg-agent" ]; # everything here lands before `source $ZSH/oh-my-zsh.sh` extraConfig = '' # make omz faster on large repositories DISABLE_UNTRACKED_FILES_DIRTY=true # only display a fancy theme when glyphs are rendered if [[ "$TERM" == "linux" || "$TERM" == "screen" ]]; then ZSH_THEME="gentoo" else ZSH_THEME="agnoster" fi ''; }; # Unlike oh-my-zsh.extraConfig above, this lands *after* # `source $ZSH/oh-my-zsh.sh`, which is where the theme's prompt functions # come into existence. initContent = lib.mkAfter '' # Keep the prompt on one line in deeply nested trees. # # Both themes render the working directory as `%~`, the full path with # $HOME collapsed to `~`. Somewhere like # ~/git/bfh/cas-pml-sem/documents/bericht that is 39 columns on its own, # and together with user@host and a long branch name the line wraps. # # `%(4~|…/%2~|%~)` is a prompt ternary: at four or more components show # an ellipsis and the last two, otherwise show the path whole. Short # paths like ~/git/nixconfig are left alone. if [[ "$ZSH_THEME" == "agnoster" ]]; then # agnoster calls prompt_dir on every render, so redefining it is # enough. AGNOSTER_DIR_* keep the segment's own colours. prompt_dir() { prompt_segment "$AGNOSTER_DIR_BG" "$AGNOSTER_DIR_FG" '%(4~|…/%2~|%~)' } else # gentoo builds PROMPT once at load time, so patch the string. Its # `%~` is the non-root branch of `%(!.%1~.%~)`, and it is the first # literal `%~` in there, so the root branch is untouched. ASCII `...` # because this branch is the Linux console, whose font may lack U+2026. PROMPT="''${PROMPT/\%~/%(4~|.../%2~|%~)}" fi ''; }; # set important env vars home.sessionVariables = { EDITOR = "vim"; NH_FLAKE = "/home/aaron/git/nixconfig"; }; }