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}