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 ]; }