Commit aa13eaf

HPCesia <me@hpcesia.com>
2026-09-10 03:04:26
zellij: split zjd to a shell application
Assisted-by: crush:deepseek-v4-flash
1 parent 942a38f
Changed files (1)
modules
dev
modules/dev/zellij/default.nix
@@ -6,75 +6,88 @@
         lib,
         config,
         ...
-      }: {
-        packages = [pkgs.zellij];
+      }: let
+        zjd = pkgs.writeShellApplication {
+          name = "zjd";
+          runtimeInputs = [
+            pkgs.zellij
+            pkgs.coreutils
+            pkgs.gnused
+            pkgs.gawk
+            pkgs.gnugrep
+          ];
+          text = ''
+            ZJD_SESSIONS="${config.xdg.cache.directory}/zellij/sessions.map"
 
-        xdg.config.files = {
-          "zellij/config.kdl".text =
-            ''
-              pane_frames false
-              show_release_notes false
-              show_startup_tips false
-            ''
-            + builtins.readFile ./keybinds.kdl;
-          "zellij/layouts".source = ./layouts;
-        };
-
-        files.".bashrc".text = lib.mkOrder 3000 ''
-          alias -- zj=zellij
-
-          ZJD_SESSIONS="${config.xdg.cache.directory}/zellij/sessions.map"
-
-          __zjd_slug() {
-            tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g; s/^-+|-+$//g'
-          }
-
-          __zjd_session_name() {
-            local name parent existing
-            name="$(printf '%s\n' "''${PWD##*/}" | __zjd_slug)"
-            [ -n "$name" ] || name="root"
-            parent="$(printf '%s\n' "''${PWD%/*}" | sed -E 's|.*/||' | __zjd_slug)"
-            [ -n "$parent" ] || parent="root"
-            existing="$(awk -v n="$name" '$1 == n { print $2 }' "$ZJD_SESSIONS" 2>/dev/null | head -1)"
-            if [ -n "$existing" ] && [ "$existing" != "$PWD" ]; then
-              name="''${parent}-''${name}"
-            fi
-            printf '%s\n' "$name"
-          }
+            __zjd_slug() {
+              tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g; s/^-+|-+$//g'
+            }
 
-          __zjd_prune() {
-            [ -f "$ZJD_SESSIONS" ] || return 0
-            local sessions data
-            sessions="$(zellij list-sessions -s 2>/dev/null)"
-            data="$(grep -v '^$' "$ZJD_SESSIONS")"
-            while IFS=' ' read -r name path; do
-              [ -n "$name" ] || continue
-              if ! grep -qx "$name" <<< "$sessions"; then
-                data="$(grep -v "^$name " <<< "$data")"
-              elif [ ! -d "$path" ]; then
-                zellij kill-session "$name" 2>/dev/null
-                data="$(grep -v "^$name " <<< "$data")"
+            __zjd_session_name() {
+              local name parent existing
+              name="$(printf '%s\n' "''${PWD##*/}" | __zjd_slug)"
+              [ -n "$name" ] || name="root"
+              parent="$(printf '%s\n' "''${PWD%/*}" | sed -E 's|.*/||' | __zjd_slug)"
+              [ -n "$parent" ] || parent="root"
+              existing="$(awk -v n="$name" '$1 == n { print $2 }' "$ZJD_SESSIONS" 2>/dev/null | head -1)"
+              if [ -n "$existing" ] && [ "$existing" != "$PWD" ]; then
+                name="''${parent}-''${name}"
               fi
-            done <<< "$data"
-            printf '%s\n' "$data" > "$ZJD_SESSIONS"
-          }
+              printf '%s\n' "$name"
+            }
+
+            __zjd_prune() {
+              [ -f "$ZJD_SESSIONS" ] || return 0
+              local sessions data
+              sessions="$(zellij list-sessions -s 2>/dev/null)"
+              data="$(grep -v '^$' "$ZJD_SESSIONS")"
+              while IFS=' ' read -r name path; do
+                [ -n "$name" ] || continue
+                if ! grep -qx "$name" <<< "$sessions"; then
+                  data="$(grep -v "^$name " <<< "$data")"
+                elif [ ! -d "$path" ]; then
+                  zellij kill-session "$name" 2>/dev/null
+                  data="$(grep -v "^$name " <<< "$data")"
+                fi
+              done <<< "$data"
+              printf '%s\n' "$data" > "$ZJD_SESSIONS"
+            }
 
-          zjd() {
             if [ -n "''${ZELLIJ:-}" ]; then
               printf '%s\n' "already in a zellij session" >&2
-              return 1
+              exit 1
             fi
+
             __zjd_prune
-            local name
             name="$(__zjd_session_name)"
             if zellij list-sessions -s 2>/dev/null | grep -qx "$name"; then
-              zellij attach "$name"
+              exec zellij attach "$name"
             else
               mkdir -p "''${ZJD_SESSIONS%/*}"
               printf '%s %s\n' "$name" "$PWD" >> "$ZJD_SESSIONS"
-              zellij -s "$name" -n dev
+              exec zellij -s "$name" -n dev
             fi
-          }
+          '';
+        };
+      in {
+        packages = [
+          pkgs.zellij
+          zjd
+        ];
+
+        xdg.config.files = {
+          "zellij/config.kdl".text =
+            ''
+              pane_frames false
+              show_release_notes false
+              show_startup_tips false
+            ''
+            + builtins.readFile ./keybinds.kdl;
+          "zellij/layouts".source = ./layouts;
+        };
+
+        files.".bashrc".text = lib.mkOrder 3000 ''
+          alias -- zj=zellij
         '';
       };
     };