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