From c16d84e75e43a4e5c48bf6742b7bd93b82d8c547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9ana=20=E6=B1=9F?= Date: Thu, 29 May 2025 15:14:39 +0200 Subject: [PATCH] packages/tmux-sessionizer: tmux-sessionizer --- .../by-name/tmux-sessionizer/package.nix | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/nix/packages/by-name/tmux-sessionizer/package.nix b/nix/packages/by-name/tmux-sessionizer/package.nix index d222db0b..6cdf7d1b 100644 --- a/nix/packages/by-name/tmux-sessionizer/package.nix +++ b/nix/packages/by-name/tmux-sessionizer/package.nix @@ -2,6 +2,8 @@ writeShellApplication, tmux, procps, + fzf, + gnused, lib, symlinkJoin, }: let @@ -72,6 +74,46 @@ ${lib.getExe tmux-attach-or-switch} "$session_name" ''; }; + + tmux-sessionizer = writeShellApplication { + name = "tmux-sessionizer"; + runtimeInputs = [fzf gnused]; + text = '' + selected=$( + { + fd . "$REPO_PATH" --exact-depth 2 --hidden --type d + fd . "$WORKTREE_PATH" --exact-depth 4 --hidden --type d + fd . "$PLAYGROUND_PATH" --exact-depth 1 --hidden --type d + echo "dotfiles" + echo "password-store" + } 2> /dev/null | sed -e "s|^$HOME|~|" | fzf) + selected=''${selected//\~/$HOME} + + if [ -z "$selected" ]; then + return 0 + fi + + # derive session name based on selected path + # dots are meaningful in tmux, remove them + session_name=''${selected//./_} + + # fixup special cases, override derived session_name if necessary + # this should be id for non-special cases + case "$selected" in + dotfiles) + selected=~/.dotfiles + ;; + password-store) + selected="$PASSWORD_STORE_DIR" + ;; + esac + + # effects + ${lib.getExe tmux-register-session} || : + ${lib.getExe tmux-maybe-create} "$session_name" "$selected" + ${lib.getExe tmux-attach-or-switch} "$session_name" + ''; + }; in symlinkJoin { name = "tmux-sessionizer"; @@ -80,5 +122,6 @@ in tmux-maybe-create tmux-attach-or-switch tmux-last + tmux-sessionizer ]; }