From 4d0d217ba8c12fae6a7fa67c3472a1f407aaa82d Mon Sep 17 00:00:00 2001 From: Yan Lin Date: Wed, 27 Aug 2025 22:46:04 +0200 Subject: [PATCH] Add interactive mode to project lanucher --- modules/zsh.nix | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/modules/zsh.nix b/modules/zsh.nix index 8a8f7dc..9239754 100644 --- a/modules/zsh.nix +++ b/modules/zsh.nix @@ -31,8 +31,6 @@ in hms = "home-manager switch --flake ~/.config/nix#yanlin"; hms-offline = "home-manager switch --flake ~/.config/nix#yanlin --option substitute false"; - # Project shortcuts - proj = "${projectLauncher}"; }; initContent = '' @@ -131,6 +129,41 @@ in fi fi } + + # Interactive project launcher with fzf + function proj() { + local project_json="$HOME/.config/nix/config/projects.json" + local launcher="${projectLauncher}" + + # If arguments provided, pass directly to launcher + if [[ $# -gt 0 ]]; then + "$launcher" "$@" + return + fi + + # Interactive mode with fzf + local project=$(jq -r '.projects | keys[]' "$project_json" 2>/dev/null | \ + fzf --header="Select project (ESC to cancel)" \ + --preview="echo '==== {} ====' && \ + jq -r '.projects.\"{}\" | \"Description: \" + .description' \"$project_json\" && \ + echo && \ + echo 'Windows:' && \ + jq -r '.projects.\"{}\" | .windows[] | \" - \" + .name + \": \" + .path' \"$project_json\" && \ + echo && \ + if tmux has-session -t {} 2>/dev/null; then \ + echo 'Status: \033[32mRunning\033[0m' && \ + echo && \ + echo 'Tmux windows:' && \ + tmux list-windows -t {} -F \" #{window_index}: #{window_name}\" 2>/dev/null; \ + else \ + echo 'Status: \033[33mNot running\033[0m'; \ + fi" \ + --preview-window=right:60%:wrap \ + --height=80% \ + --ansi) + + [[ -n "$project" ]] && "$launcher" "$project" + } ''; };