main
  1{den, ...}: {
  2  den.aspects.core.includes = [den.aspects.core.shell];
  3  den.aspects.core.shell = {
  4    nixos = {
  5      pkgs,
  6      lib,
  7      ...
  8    }: {
  9      # Flyline right prompt support. RPS1 wiring is upstream PR #7673;
 10      # multi-line right prompts are a local extension.
 11      nixpkgs.overlays = [
 12        (final: prev: {
 13          starship = prev.starship.overrideAttrs (finalAttrs: prevAttrs: {
 14            patches = (prevAttrs.patches or []) ++ [./starship-flyline-rps1.patch];
 15            doCheck = false;
 16          });
 17        })
 18      ];
 19
 20      environment.systemPackages = [
 21        pkgs.starship
 22        pkgs.nur.repos.hpcesia.flyline
 23      ];
 24
 25      environment.etc."starship.toml".source = ./starship.toml;
 26
 27      environment.variables.STARSHIP_CONFIG = "/etc/starship.toml";
 28
 29      programs.bash = {
 30        enable = true;
 31        completion.enable = true;
 32        promptInit = "";
 33        interactiveShellInit = ''
 34          enable -f ${pkgs.nur.repos.hpcesia.flyline}/lib/libflyline.so flyline
 35          flyline mouse --mode disabled
 36          flyline set-cursor --backend terminal
 37
 38          flyline create-prompt-widget custom \
 39            --name STARSHIP_TRANSIENT \
 40            --command '${lib.getExe pkgs.starship} prompt --profile transient' \
 41            --block
 42          PS1_FINAL=STARSHIP_TRANSIENT
 43
 44          RPS1_FINAL=""
 45
 46          PROMPT_RULER="empty-line"
 47
 48          if [ "$TERM" != "dumb" ]; then
 49            eval "$(${lib.getExe pkgs.starship} init bash)"
 50          fi
 51        '';
 52      };
 53    };
 54
 55    provides.to-users = {
 56      persistHome = {config, ...}: {
 57        directories = [
 58          "${config.xdg.data.directory}/stinkpot"
 59        ];
 60      };
 61
 62      hjem = {
 63        pkgs,
 64        lib,
 65        ...
 66      }: {
 67        imports = [./_module.nix];
 68
 69        packages = [pkgs.nur.repos.hpcesia.stinkpot];
 70
 71        programs.bash = {
 72          interactiveShellInit = ''
 73            eval "$(${lib.getExe pkgs.nur.repos.hpcesia.stinkpot} init)"
 74            flyline key bind Ctrl+r 'always=runBashCommand(__stinkpot_search)'
 75
 76            __ix_history_flush() {
 77              history -a
 78            }
 79            if [[ ";''${PROMPT_COMMAND[*]:-};" != *";__ix_history_flush;"* ]]; then
 80              if [[ "$(declare -p PROMPT_COMMAND 2>&1)" == "declare -a"* ]]; then
 81                PROMPT_COMMAND=("''${PROMPT_COMMAND[@]}" __ix_history_flush)
 82              else
 83                PROMPT_COMMAND="''${PROMPT_COMMAND:+$PROMPT_COMMAND;}__ix_history_flush"
 84              fi
 85            fi
 86
 87            # Fix Flyline panic in Zellij
 88            __ix_fix_term_size() {
 89              local rows cols
 90              IFS=' ' read -r rows cols < <(stty size 2>/dev/null)
 91              if [ "''${cols:-0}" -gt 0 ] && [ "''${rows:-0}" -gt 0 ]; then
 92                export COLUMNS="$cols" LINES="$rows"
 93              else
 94                [ "''${COLUMNS:-0}" -gt 0 ] || COLUMNS=80
 95                [ "''${LINES:-0}" -gt 0 ] || LINES=24
 96                export COLUMNS LINES
 97              fi
 98            }
 99            if [[ ";''${PROMPT_COMMAND[*]:-};" != *";__ix_fix_term_size;"* ]]; then
100              if [[ "$(declare -p PROMPT_COMMAND 2>&1)" == "declare -a"* ]]; then
101                PROMPT_COMMAND=("''${PROMPT_COMMAND[@]}" __ix_fix_term_size)
102              else
103                PROMPT_COMMAND="''${PROMPT_COMMAND:+$PROMPT_COMMAND;}__ix_fix_term_size"
104              fi
105            fi
106          '';
107        };
108      };
109    };
110  };
111}