grace/dots
dotfiles/nix configs
git clone https://git.gae.moe/grace/dots
8e8bfe4
main
1{ 2config , 3lib , 4pkgs , 5 ... 6} : 7 8let 9tpbSrc = builtins . fetchGit { 10url = "https://git.gae.moe/grace/tpb.git" ; 11ref = "refs/heads/main" ; 12}; 13in 14{ 15home . packages = with pkgs ; [ 16pfetch-rs 17sesh 18ripgrep 19dust 20tree 21btop 22curl 23fd 24uutils-coreutils 25wget 26jq 27yq 28yj 29most 30asciinema 31bash 32openssh 33openssl 34 35( 36( import " ${ tpbSrc } /default.nix" { 37inherit pkgs ; 38}). overrideAttrs 39( _ :{ 40unpackPhase = '' 41mkdir source 42tar --no-same-owner --no-same-permissions --no-overwrite-dir --mode=0755 \ 43-C " $ src " -cf - . \ 44| tar --no-same-owner --no-same-permissions --no-overwrite-dir --mode=0755 \ 45-C source -xf - 46chmod -R u+w source 47sourceRoot =source 48'' ; 49}) 50) 51]; 52 53xdg . configFile . "fish/themes/rose_pine.theme" . source = ../fish/rose_pine.theme ; 54 55programs . fish = { 56enable = true ; 57 58shellAliases = { 59setupidf = "source /opt/esp/esp-idf/export.fish" ; 60pysource = "source .venv/bin/activate.fish" ; 61tcl = "clear && clear" ; 62tclear = "clear && clear" ; 63}; 64 65functions = { 66nixos-target = { 67description = "Build and deploy a local NixOS configuration to a remote host" ; 68body = '' 69set -lx NIX_HOST $argv[1] 70${ pkgs . nixos-rebuild } /bin/nixos-rebuild switch \ 71--file ./system.nix \ 72--build-host builder@dijkstra.i.gae.moe \ 73--target-host "grace@$NIX_HOST.i.gae.moe" \ 74--elevate sudo 75'' ; 76}; 77 78ask = { 79description = "Ask for input and respond with input" ; 80body = '' 81read -s -P "Enter Input: " response 82echo $response 83'' ; 84}; 85 86loadenv = '' 87argparse h/help print printb U/unload -- $argv 88or return 1 89 90if set -q _flag_help 91echo "Usage: loadenv [OPTIONS] [FILE]" 92echo "" 93echo "Export keys and values from a dotenv file." 94echo "" 95echo "Options:" 96echo " --help, -h Show this help message" 97echo " --print Print env keys (export preview)" 98echo " --printb Print keys with surrounding brackets" 99echo " --unload, -U Unexport all keys defined in the dotenv file" 100echo "" 101echo "Arguments:" 102echo " FILE Path to dotenv file (default: .env)" 103return 0 104end 105 106if test (count $argv) -gt 1 107echo "Too many arguments. Only one argument is allowed. Use --help for more information." 108return 1 109end 110 111set -l dotenv_file ".env" 112if test (count $argv) -eq 1 113set dotenv_file $argv[1] 114end 115 116if not test -f $dotenv_file 117echo "Error: File '$dotenv_file' not found in the current directory." 118return 1 119end 120 121set -l mode load 122if set -q _flag_print 123set mode print 124else if set -q _flag_printb 125set mode printb 126else if set -q _flag_unload 127set mode unload 128end 129 130set lineNumber 0 131 132for line in (cat $dotenv_file) 133set lineNumber (math $lineNumber + 1) 134 135if string match -qr '^\s*$|^\s*#' $line 136continue 137end 138 139if not string match -qr '^[A-Za-z_][A-Za-z0-9_]*=' $line 140echo "Error: invalid declaration (line $lineNumber): $line" 141return 1 142end 143 144set -l key (string split -m 1 '=' $line)[1] 145set -l after_equals_sign (string split -m 1 '=' $line)[2] 146 147set -l value 148set -l double_quoted_value_regex '^"(.*)"\s*(?:#.*)*$' 149set -l single_quoted_value_regex '^\'(.*)\'\s*(?:#.*)*$' 150set -l plain_value_regex '^([^\'"\s]*)\s*(?:#.*)*$' 151if string match -qgr $double_quoted_value_regex $after_equals_sign 152set value (string match -gr $double_quoted_value_regex $after_equals_sign) 153else if string match -qgr $single_quoted_value_regex $after_equals_sign 154set value (string match -gr $single_quoted_value_regex $after_equals_sign) 155else if string match -qgr $plain_value_regex $after_equals_sign 156set value (string match -gr $plain_value_regex $after_equals_sign) 157else 158echo "Error: invalid value (line $lineNumber): $line" 159return 1 160end 161 162switch $mode 163case print 164echo "$key=$value" 165case printb 166echo "[$key=$value]" 167case load 168set -gx $key $value 169case unload 170set -e $key 171end 172end 173'' ; 174 175# Broken :/ 176nix = { 177wraps = "nix" ; 178body = '' 179if test (count $argv) -gt 0; and test "$argv[1]" = shell 180set -lx STARSHIP_NIX_SHELL shell 181end 182 183command nix $argv 184'' ; 185}; 186 187sshsignkey = '' 188argparse \ 189't/tag=+' \ 190'h/host=' \ 191'u/user=' \ 192'I/identity=' \ 193'V/validity=' \ 194-- $argv 195or return 2 196 197if test (count $argv) -ne 1 198echo "usage: sshsignkey [-t TAG ...] [-h HOST] [-u USER] [-I ID] [-V VALIDITY] 'PUBLIC KEY'" >&2 199return 2 200end 201 202set -l ca_pub ~/.ssh/ssh-ca.pub 203set -l principals 204 205for tag in $_flag_tag 206set -a principals "t:$tag" 207end 208 209if set -q _flag_host 210set -a principals "h:$_flag_host" 211end 212 213if set -q _flag_user 214set -a principals "u:$_flag_user" 215end 216 217if test (count $principals) -eq 0 218echo "sshsignkey: at least one principal is required" >&2 219return 2 220end 221 222if set -q _flag_identity 223set -l identity "$_flag_identity" 224else if set -q _flag_user; and set -q _flag_host 225set -l identity "$_flag_user@$_flag_host" 226else if set -q _flag_user 227set -l identity "$_flag_user" 228else if set -q _flag_host 229set -l identity "$_flag_host" 230else 231set -l identity "ssh-cert" 232end 233 234if not test -f "$ca_pub" 235echo "sshsignkey: CA public key not found: $ca_pub" >&2 236return 1 237end 238 239set -l pivroot (dirname (dirname " ${ pkgs . yubico-piv-tool } /bin/yubico-piv-tool")) 240 241set -l ykcs11 ( 242${ pkgs . findutils } /bin/find "$pivroot" \ 243-name 'libykcs11.dylib' \ 244-o -name 'libykcs11.so' \ 245| ${ pkgs . coreutils } /bin/head -n1 246) 247 248if test -z "$ykcs11" 249echo "sshsignkey: could not find libykcs11" >&2 250return 1 251end 252 253set -l tmpdir ( ${ pkgs . coreutils } /bin/mktemp -d) 254or return 1 255 256set -l pubfile "$tmpdir/key.pub" 257printf '%s\n' "$argv[1]" > "$pubfile" 258 259set -l ssh_args \ 260-s "$ca_pub" \ 261-D "$ykcs11" \ 262-I "$identity" \ 263-n (string join ',' $principals) 264 265if set -q _flag_validity 266set -a ssh_args -V "$_flag_validity" 267end 268 269set -lx SSH_ASKPASS_REQUIRE force 270set -lx SSH_ASKPASS ${ pkgs . writeShellScript "yubikey-verify-none" '' 271printf '%s\n' VERIFY_NONE 272'' } 273 274echo "Touch your YubiKey to sign the SSH certificate..." >&2 275 276${ pkgs . openssh } /bin/ssh-keygen $ssh_args "$pubfile" >/dev/null 277set -l rc $status 278 279if test $rc -ne 0 280${ pkgs . coreutils } /bin/rm -rf "$tmpdir" 281return $rc 282end 283 284${ pkgs . coreutils } /bin/cat "$tmpdir/key-cert.pub" 285 286${ pkgs . coreutils } /bin/rm -rf "$tmpdir" 287'' ; 288}; 289 290interactiveShellInit = '' 291set -g fish_greeting "" 292fish_vi_key_bindings 293fish_config theme choose rose_pine 294pfetch 295'' ; 296}; 297 298programs . fzf = { 299enable = true ; 300enableFishIntegration = true ; 301}; 302 303programs . zoxide = { 304enable = true ; 305enableFishIntegration = true ; 306}; 307 308programs . starship = { 309enable = true ; 310enableFishIntegration = true ; 311extraPackages = [ 312pkgs . jj-starship 313]; 314 315settings = { 316format = lib . concatStrings [ 317"$hostname" 318"$username" 319"$directory" 320"$git_branch" 321"$git_status" 322"\${custom.jj}" 323"\${custom.git_status}" 324"$fill" 325"\${env_var.NIX_SHELL}" 326"$c" 327"$elixir" 328"$elm" 329"$golang" 330"$haskell" 331"$java" 332"$julia" 333"$nodejs" 334"$nim" 335"$rust" 336"$scala" 337"$conda" 338"$python" 339"$time" 340"\n" 341"[❯](fg:iris) " 342]; 343 344palette = "rose-pine" ; 345 346palettes = { 347rose-pine = { 348overlay = "#26233a" ; 349love = "#eb6f92" ; 350gold = "#f6c177" ; 351rose = "#ebbcba" ; 352pine = "#31748f" ; 353foam = "#9ccfd8" ; 354iris = "#c4a7e7" ; 355}; 356}; 357 358directory = { 359format = "[](fg:overlay)[ $path ]($style)[](fg:overlay) " ; 360style = "bg:overlay fg:pine" ; 361truncation_length = 3 ; 362truncation_symbol = "…/" ; 363 364substitutions = { 365Documents = "" ; 366Downloads = " " ; 367Music = " " ; 368Pictures = " " ; 369}; 370}; 371 372fill = { 373style = "fg:overlay" ; 374symbol = " " ; 375}; 376 377git_branch = { 378disabled = true ; 379format = "[](fg:overlay)[ $symbol $branch ]($style)[](fg:overlay) " ; 380style = "bg:overlay fg:foam" ; 381symbol = "" ; 382}; 383 384git_status = { 385disabled = true ; 386style = "bg:overlay fg:love" ; 387format = "[](fg:overlay)([$all_status$ahead_behind]($style))[](fg:overlay) " ; 388 389up_to_date = "[ ✓ ](bg:overlay fg:iris)" ; 390 391untracked = ''[?\($count\)](bg:overlay fg:gold)'' ; 392 393stashed = ''[\$](bg:overlay fg:iris)'' ; 394 395modified = ''[!\($count\)](bg:overlay fg:gold)'' ; 396 397renamed = ''[»\($count\)](bg:overlay fg:iris)'' ; 398 399deleted = ''[✘\($count\)](style)'' ; 400 401staged = ''[++\($count\)](bg:overlay fg:gold)'' ; 402 403ahead = ''[⇡\(''${count}\)](bg:overlay fg:foam)'' ; 404 405diverged = ''⇕[\[](bg:overlay fg:iris)[⇡\(''${ahead_count}\)](bg:overlay fg:foam)[⇣\(''${behind_count}\)](bg:overlay fg:rose)[\]](bg:overlay fg:iris)'' ; 406 407behind = ''[⇣\(''${count}\)](bg:overlay fg:rose)'' ; 408}; 409 410custom = { 411jj = { 412command = '' 413jj-starship --git-symbol "" --no-git-status | sed "s/\x1b\[0m//g" 414'' ; 415 416when = "jj-starship detect" ; 417 418shell = [ 419"sh" 420]; 421 422format = "[](fg:overlay)[[ $output ](bg:overlay)]($style)[](fg:overlay) " ; 423 424style = "bg:overlay fg:rose" ; 425 426unsafe_no_escape = true ; 427}; 428 429git_status = { 430command = '' 431git status --porcelain | awk ' 432/^[MARC ][MD]/ || /^[MARC][MARC ]/ { modified++ } 433/^\?\?/ { untracked++ } 434/^[D ]D/ || /^D/ { deleted++ } 435END { 436if (modified + untracked + deleted == 0) { 437printf "\033[38;2;196;167;231m✓" 438} else { 439if (modified) printf "\033[38;2;246;193;119m%d ", modified 440if (untracked) printf "\033[38;2;246;193;119m%d ", untracked 441if (deleted) printf "\033[38;2;235;111;146m%d ", deleted 442} 443} 444' 445 446unpushed=$(git rev-list @{u}..HEAD 2>/dev/null | wc -l | tr -d ' ') 447 448if [ -n "$unpushed" ] && [ "$unpushed" -gt 0 ]; then 449printf "\033[38;2;137;220;235m⇡%d " "$unpushed" 450fi 451'' ; 452 453when = "git rev-parse --is-inside-work-tree 2>/dev/null && ! jj root 2>/dev/null" ; 454 455shell = [ 456"sh" 457]; 458 459format = "[](fg:overlay)[[ $output ](bg:overlay)]($style)[](fg:overlay) " ; 460 461style = "bg:overlay fg:love" ; 462 463unsafe_no_escape = true ; 464}; 465}; 466 467time = { 468disabled = false ; 469format = " [](fg:overlay)[ $time ]($style)[](fg:overlay)" ; 470style = "bg:overlay fg:rose" ; 471time_format = "%I:%M%P" ; 472use_12hr = true ; 473}; 474 475hostname = { 476disabled = false ; 477ssh_only = false ; 478trim_at = "" ; 479format = "[](fg:overlay)[ $hostname$ssh_symbol ]($style)[](fg:overlay) " ; 480style = "bg:overlay fg:rose" ; 481ssh_symbol = " " ; 482}; 483 484username = { 485disabled = false ; 486format = "[](fg:overlay)[ $user ]($style)[](fg:overlay) " ; 487show_always = true ; 488style_root = "bg:overlay fg:iris" ; 489style_user = "bg:overlay fg:iris" ; 490}; 491 492env_var . NIX_SHELL = { 493variable = "STARSHIP_NIX_SHELL" ; 494symbol = " " ; 495format = "[](fg:overlay)[ $symbol$env_value ]($style)[](fg:overlay) " ; 496style = "bg:overlay fg:foam" ; 497}; 498 499# Languages 500 501c = { 502style = "bg:overlay fg:pine" ; 503format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 504disabled = false ; 505symbol = " " ; 506}; 507 508elixir = { 509style = "bg:overlay fg:pine" ; 510format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 511disabled = false ; 512symbol = " " ; 513}; 514 515elm = { 516style = "bg:overlay fg:pine" ; 517format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 518disabled = false ; 519symbol = " " ; 520}; 521 522golang = { 523style = "bg:overlay fg:pine" ; 524format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 525disabled = false ; 526symbol = " " ; 527}; 528 529haskell = { 530style = "bg:overlay fg:pine" ; 531format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 532disabled = false ; 533symbol = " " ; 534}; 535 536java = { 537style = "bg:overlay fg:pine" ; 538format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 539disabled = false ; 540symbol = " " ; 541}; 542 543julia = { 544style = "bg:overlay fg:pine" ; 545format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 546disabled = false ; 547symbol = " " ; 548}; 549 550nodejs = { 551style = "bg:overlay fg:pine" ; 552format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 553disabled = false ; 554symbol = " " ; 555}; 556 557nim = { 558style = "bg:overlay fg:pine" ; 559format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 560disabled = false ; 561symbol = " " ; 562}; 563 564rust = { 565style = "bg:overlay fg:pine" ; 566format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 567disabled = false ; 568symbol = " " ; 569}; 570 571scala = { 572style = "bg:overlay fg:pine" ; 573format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 574disabled = false ; 575symbol = " " ; 576}; 577 578python = { 579style = "bg:overlay fg:pine" ; 580format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)" ; 581disabled = false ; 582symbol = " " ; 583}; 584 585conda = { 586style = "bg:overlay fg:pine" ; 587format = " [](fg:overlay)[ $symbol$environment ]($style)[](fg:overlay)" ; 588disabled = false ; 589symbol = "🅒 " ; 590}; 591}; 592}; 593 594}