39 lines
1.0 KiB
Bash
Executable File
39 lines
1.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -e
|
|
|
|
projects_dir=$HOME/Projects
|
|
|
|
# All depth-2 directories without @ are included unconditionally
|
|
projects=()
|
|
for dir in "$projects_dir"/*/*/; do
|
|
[ -d "$dir" ] || continue
|
|
relative="${dir#$projects_dir/}"
|
|
relative="${relative%/}"
|
|
[[ "$relative" != *@* ]] && projects+=("$relative")
|
|
done
|
|
|
|
# For @ directories, only include those with .git
|
|
if command -v fd &>/dev/null; then
|
|
while IFS= read -r line; do
|
|
projects+=("$line")
|
|
done < <(fd -H '^\.git$' "$projects_dir" |
|
|
grep '@' |
|
|
sed -E -e "s|^$projects_dir/||" -e 's|/\.git/?$||')
|
|
else
|
|
while IFS= read -r line; do
|
|
projects+=("$line")
|
|
done < <(find "$projects_dir" \( -name 'node_modules' -o -name '.git' \) \
|
|
-prune -name '.git' -print |
|
|
grep '@' |
|
|
sed -E -e "s|^$projects_dir/||" -e 's|/\.git/?$||')
|
|
fi
|
|
|
|
project=$(
|
|
printf '%s\n' "${projects[@]}" | sort -u |
|
|
fzf --layout=reverse --info=hidden --border=rounded --cycle
|
|
)
|
|
|
|
tmux new-window -n "$project" -c "$projects_dir/$project"
|
|
~/.local/share/tmux/layouts/window-auto
|