grace/dots

dotfiles/nix configs

git clone https://git.gae.moe/grace/dots

Grace Yoderhamano againa4b6f88

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