Commit 7e3c43f
Changed files (1)
modules
dev
zellij
modules/dev/zellij/default.nix
@@ -1,7 +1,12 @@
{
den.aspects.dev.zellij = {
provides.to-users = {
- hjem = {pkgs, ...}: {
+ hjem = {
+ pkgs,
+ lib,
+ config,
+ ...
+ }: {
packages = [pkgs.zellij];
xdg.config.files = {
@@ -15,9 +20,61 @@
"zellij/layouts".source = ./layouts;
};
- files.".bashrc".text = ''
+ files.".bashrc".text = lib.mkOrder 3000 ''
alias -- zj=zellij
- alias -- zjd='zellij --layout dev'
+
+ 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_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
+ fi
+ __zjd_prune
+ local name
+ name="$(__zjd_session_name)"
+ if zellij list-sessions -s 2>/dev/null | grep -qx "$name"; then
+ zellij attach "$name"
+ else
+ mkdir -p "''${ZJD_SESSIONS%/*}"
+ printf '%s %s\n' "$name" "$PWD" >> "$ZJD_SESSIONS"
+ zellij -s "$name" -n dev
+ fi
+ }
'';
};
};