main
 1{den, ...}: {
 2  den.aspects.core.includes = [den.aspects.core.shell];
 3  den.aspects.core.shell = {
 4    nixos = {pkgs, ...}: let
 5      flyline-src = pkgs.fetchFromGitHub {
 6        owner = "HalFrgrd";
 7        repo = "flyline";
 8        tag = "v1.7.1";
 9        hash = "sha256-MscTAE921ymn0qyL3YQ06P3+AGg23c//6rh7+c+Iv4Y=";
10      };
11      flyline = (pkgs.callPackage "${flyline-src}/nix/package.nix" {}).overrideAttrs {
12        cargoDeps = pkgs.rustPlatform.importCargoLock {
13          lockFile = "${flyline-src}/Cargo.lock";
14          outputHashes = {
15            "ansi-to-tui-8.0.1" = "sha256-kjTxPzF0eIgJqtfsmquAqo1UFt1hXWv4oACFRgnHg9k=";
16            "flash-0.0.6" = "sha256-lIfTgRdBQWqOeYo3XkI/X6Q/0Vrcpm5vJMCxtX4u9Go=";
17            "flycomp-1.1.2" = "sha256-ipOFG1ZSro5OyWzCu28AYd2+eAuSW7vRDHOT5PuxDPA=";
18            "ratatui-0.30.2" = "sha256-68o9FXF2ioEuXyCq+3254ud95mVF3FRKVPOuBFKWeSI=";
19            "skim-4.6.0" = "sha256-cUSiXwEWUDZccbl3sts2DG4ZNzYExD9ra/VESv2u+Zs=";
20            "termina-0.3.3" = "sha256-WpBKKnOhA+Q1+iopQ3IcGxsjGGW1SNweo8R7gFN5QRA=";
21          };
22        };
23      };
24    in {
25      environment.systemPackages = [flyline];
26
27      programs.bash = {
28        enable = true;
29        completion.enable = true;
30        interactiveShellInit = ''
31          enable -f ${flyline}/lib/libflyline.so flyline
32        '';
33        promptInit = ''
34          # Provide a nice prompt if the terminal supports it.
35          if [ "$TERM" != "dumb" ] || [ -n "$INSIDE_EMACS" ]; then
36            PROMPT_COLOR="1;31m"
37            ((UID)) && PROMPT_COLOR="1;32m"
38            # Show the hostname only when connected via SSH.
39            SSH_HOST=""
40            [ -n "$SSH_CONNECTION" ] && SSH_HOST="@$HOSTNAME"
41            if [ -n "$INSIDE_EMACS" ]; then
42              # Emacs term mode doesn't support xterm title escape sequence (\e]0;)
43              PS1="\[\033[$PROMPT_COLOR\]\u$SSH_HOST\[\033[0m\]: \[\033[1;34m\]\w\[\033[0m\]\n\[\033[$PROMPT_COLOR\]\\$\[\033[0m\] "
44            else
45              PS1="\[\033[$PROMPT_COLOR\]\u$SSH_HOST\[\033[0m\]: \[\033[1;34m\]\w\[\033[0m\]\n\[\033[$PROMPT_COLOR\]\\$\[\033[0m\] "
46              PS1="\[\e]0;\u@\h: \w\a\]$PS1"
47            fi
48            if test "$TERM" = "xterm"; then
49              PS1="\[\033]2;\h:\u:\w\007\]$PS1"
50            fi
51            # Final (transient) prompt: replace the two-line prompt in scrollback.
52            PS1_FINAL="\[\033[$PROMPT_COLOR\]\u@\h\\$\[\033[0m\] "
53          fi
54        '';
55      };
56    };
57  };
58}