.files/nix/packages/by-name/tmux-sessionizer/package.nix
Léana 江 29c4ca1a81
packages/tmux-sessionizer: remove tmux-register-session
We already use the builtin leader-l binding, no need to keep this.
2025-11-09 23:05:20 +08:00

91 lines
2.1 KiB
Nix

{
writeShellApplication,
tmux,
procps,
fzf,
gnused,
lib,
symlinkJoin,
}:
let
tmux-maybe-create = writeShellApplication {
name = "__tmux-maybe-create";
runtimeInputs = [
procps
tmux
];
text = ''
session_name="$1"
session_dir="$2"
if ! pgrep tmux >/dev/null 2>&1 || ! tmux has -t="$session_name" 2>/dev/null; then
tmux new-session -ds "$session_name" -c "$session_dir"
fi
'';
};
tmux-attach-or-switch = writeShellApplication {
name = "__tmux-attach-or-switch";
runtimeInputs = [ tmux ];
text = ''
session_name="$1"
TMUX=''${TMUX:-}
if [ -z "$TMUX" ]; then
tmux attach-session -t "$session_name"
else
tmux switch-client -t "$session_name"
fi
'';
};
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 3 --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-maybe-create} "$session_name" "$selected"
${lib.getExe tmux-attach-or-switch} "$session_name"
'';
};
in
symlinkJoin {
name = "tmux-sessionizer";
paths = [
tmux-maybe-create
tmux-attach-or-switch
tmux-sessionizer
];
}