{ config, pkgs, lib, ... }: let c = config.lib.stylix.colors; # One dot per base16 slot. The literal \u001b in the format string stays a # JSON escape here — fastfetch's JSONC parser turns it into a real ESC byte. # Foreground glyph, not a background-coloured space: a coloured space is # invisible anywhere the colour is stripped (copy/paste, piped output). swatch = n: "\\u001b[38;2;${c."${n}-rgb-r"};${c."${n}-rgb-g"};${c."${n}-rgb-b"}m● "; paletteRow = names: lib.concatMapStrings swatch names + "\\u001b[0m"; isDesktop = lib.elem config.networking.hostName [ "FredOS-Gaming" "FredOS-Macbook" ]; in { # Install fastfetch environment.systemPackages = with pkgs; [ fastfetch ]; # Install Nerd Fonts for icon support fonts.packages = with pkgs; [ nerd-fonts.fira-code nerd-fonts.fira-mono nerd-fonts.jetbrains-mono nerd-fonts.meslo-lg ]; # Simple fastfetch config — run `fastfetch` manually for system info environment.etc."fastfetch/config.jsonc".text = '' { "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", "logo": { "source": "none" }, "display": { "separator": " ", "color": { "keys": "blue", "title": "cyan" }, "key": { "type": "icon" } }, "modules": [ { "type": "title", "format": "{user-name}@{host-name}" }, "separator", "os", "kernel", "uptime", "memory", "break", "wm",${lib.optionalString isDesktop '' { "type": "custom", "key": "Shell", "keyIcon": "󰕮", "format": "Quickshell ${pkgs.quickshell.version} (bar, launcher, lock)" },''} "shell", "terminal", "break", { "type": "custom", "key": "Palette", "keyIcon": "󰸌", "format": "${paletteRow [ "base00" "base01" "base02" "base03" "base04" "base05" "base06" "base07" "base08" "base09" "base0A" "base0B" "base0C" "base0D" "base0E" "base0F" ]}" } ] } ''; # Fish shell settings and custom powerline prompt programs.fish.interactiveShellInit = '' # Disable default greeting set -g fish_greeting # Custom powerline prompt function fish_prompt set -l last_status $status # Nix-shell indicator if set -q IN_NIX_SHELL set_color -o yellow printf "[nix-shell] " set_color normal end # --- Line 1: powerline segments --- # Left round cap + NixOS icon set_color 394b70 printf "" set_color 7dcfff -b 394b70 printf " " # Arrow transition: nix -> hostname set_color 394b70 -b e0af68 printf "" set_color 000000 -b e0af68 printf " %s " (hostname) # Path segments - each folder gets its own color set -l realhome (string escape --style=regex -- $HOME) set -l rawpath (string replace -r "^$realhome" "~" $PWD) set -l parts (string split "/" $rawpath) set -l path_colors 41a6b5 9ece6a 7aa2f7 set -l prev_bg e0af68 set -l seg_count 0 for part in $parts if test -n "$part" set seg_count (math $seg_count + 1) set -l cidx (math "(" $seg_count - 1 ")" "%" 3 + 1) set -l seg_bg $path_colors[$cidx] # Arrow from previous segment set_color $prev_bg -b $seg_bg printf "" set_color 1a1b26 -b $seg_bg printf " %s " $part set prev_bg $seg_bg end end # Git branch (if in a repo) set -l branch (command git branch --show-current 2>/dev/null) if test -n "$branch" set_color $prev_bg -b bb9af7 printf "" set_color 1a1b26 -b bb9af7 printf "  %s " $branch set prev_bg bb9af7 end # Final arrow to terminal bg set_color $prev_bg -b normal printf "" set_color normal printf "\n" # --- Line 2: prompt character --- if test $last_status -ne 0 set_color red else set_color magenta end printf "❯ " set_color normal end function fish_right_prompt; end # GPU load, averaged. A single read of gpu_busy_percent is worthless — # it catches whatever transient the card was in at that instant. Settle # first, then sample, and report the spread as well as the mean: a # steady 30% and a 0-to-70% sawtooth are different problems. function gpumean --description "Mean GPU busy % — 5s settle, then N seconds at 5Hz (default 10)" set -l secs 10 test (count $argv) -gt 0; and set secs $argv[1] # find, not a glob: an unmatched wildcard is an error in fish and would # abort the function before the emptiness check below. -L is required — # /sys/class/drm/cardN is a symlink, so a plain find never descends into # it and silently reports no GPUs at all. set -l cards (find -L /sys/class/drm -maxdepth 3 -name gpu_busy_percent 2>/dev/null | sort) if test (count $cards) -eq 0 echo "no gpu_busy_percent found (amdgpu/i915 only — nvidia doesn't expose it)" return 1 end sleep 5 set -l sum; set -l lo; set -l hi for c in $cards set -a sum 0; set -a lo 100; set -a hi 0 end set -l n (math "$secs * 5") for i in (seq $n) for j in (seq (count $cards)) set -l v (cat $cards[$j]) set sum[$j] (math "$sum[$j] + $v") test $v -lt $lo[$j]; and set lo[$j] $v test $v -gt $hi[$j]; and set hi[$j] $v end sleep 0.2 end for j in (seq (count $cards)) set -l name (string replace -r '.*/(card[0-9]+)/.*' '$1' $cards[$j]) echo "$name mean="(math -s0 "$sum[$j] / $n")"% min=$lo[$j]% max=$hi[$j]% ($secs""s)" end end ''; }