nixos/settings/shell.nix

196 lines
6 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ 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.
# cardN only renderDN is the same physical device under a second name
# and would otherwise be reported twice.
set -l cards (find -L /sys/class/drm -maxdepth 3 -name gpu_busy_percent 2>/dev/null | grep -E '/card[0-9]+/' | 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
'';
}