main
  1{
  2  den.aspects.dev.zellij = {
  3    provides.to-users = {
  4      hjem = {
  5        pkgs,
  6        lib,
  7        config,
  8        ...
  9      }: let
 10        zjd = pkgs.writeShellApplication {
 11          name = "zjd";
 12          runtimeInputs = [
 13            pkgs.zellij
 14            pkgs.coreutils
 15            pkgs.gnused
 16            pkgs.gawk
 17            pkgs.gnugrep
 18          ];
 19          text = ''
 20            ZJD_SESSIONS="${config.xdg.cache.directory}/zellij/sessions.map"
 21
 22            __zjd_slug() {
 23              tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g; s/^-+|-+$//g'
 24            }
 25
 26            __zjd_session_name() {
 27              local name parent existing
 28              name="$(printf '%s\n' "''${PWD##*/}" | __zjd_slug)"
 29              [ -n "$name" ] || name="root"
 30              parent="$(printf '%s\n' "''${PWD%/*}" | sed -E 's|.*/||' | __zjd_slug)"
 31              [ -n "$parent" ] || parent="root"
 32              existing="$(awk -v n="$name" '$1 == n { print $2 }' "$ZJD_SESSIONS" 2>/dev/null | head -1)"
 33              if [ -n "$existing" ] && [ "$existing" != "$PWD" ]; then
 34                name="''${parent}-''${name}"
 35              fi
 36              printf '%s\n' "$name"
 37            }
 38
 39            __zjd_prune() {
 40              [ -f "$ZJD_SESSIONS" ] || return 0
 41              local sessions data name path kept=""
 42              sessions="$(zellij list-sessions -s 2>/dev/null || true)"
 43              data="$(grep -v '^$' "$ZJD_SESSIONS" 2>/dev/null || true)"
 44              while IFS=' ' read -r name path; do
 45                [ -n "$name" ] || continue
 46                if [ -n "$path" ] && [ -d "$path" ] && grep -qx "$name" <<< "$sessions"; then
 47                  printf -v kept '%s%s %s\n' "$kept" "$name" "$path"
 48                  continue
 49                fi
 50                if grep -qx "$name" <<< "$sessions"; then
 51                  zellij delete-session --force "$name" >/dev/null 2>&1 || true
 52                fi
 53              done <<< "$data"
 54              printf '%s' "$kept" > "$ZJD_SESSIONS"
 55            }
 56
 57            if [ -n "''${ZELLIJ:-}" ]; then
 58              printf '%s\n' "already in a zellij session" >&2
 59              exit 1
 60            fi
 61
 62            __zjd_prune
 63            name="$(__zjd_session_name)"
 64            if zellij list-sessions -s 2>/dev/null | grep -qx "$name"; then
 65              exec zellij attach "$name"
 66            else
 67              mkdir -p "''${ZJD_SESSIONS%/*}"
 68              printf '%s %s\n' "$name" "$PWD" >> "$ZJD_SESSIONS"
 69              exec zellij -s "$name" -n dev
 70            fi
 71          '';
 72        };
 73      in {
 74        packages = [
 75          pkgs.zellij
 76          zjd
 77        ];
 78
 79        xdg.config.files = {
 80          "zellij/config.kdl".text =
 81            ''
 82              pane_frames false
 83              simplified_ui true
 84              show_release_notes false
 85              show_startup_tips false
 86
 87              layout_dir "${./layouts}"
 88            ''
 89            + builtins.readFile ./keybinds.kdl;
 90        };
 91
 92        programs.bash.shellAliases = {
 93          zj = "zellij";
 94        };
 95      };
 96    };
 97  };
 98
 99  den.aspects.dev.zellij.themes = {
100    catppuccin = {
101      hjem = {
102        xdg.config.files."zellij/config.kdl".text = ''
103          theme "catppuccin-mocha"
104        '';
105      };
106    };
107  };
108}