-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtmux-sessionizer
More file actions
executable file
·170 lines (141 loc) · 4.94 KB
/
Copy pathtmux-sessionizer
File metadata and controls
executable file
·170 lines (141 loc) · 4.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#!/usr/bin/env bash
# Get paths dynamically
FZF=$(command -v fzf)
TMUX_BIN=$(command -v tmux)
# Create a temporary file to store directory mappings
tmpfile=$(mktemp)
find ~/Developer -mindepth 1 -maxdepth 1 -type d -exec basename {} \; > "$tmpfile"
echo "dotfiles" >> "$tmpfile"
# Capture both query and selection from fzf, showing only folder names
fzf_output=$(cat "$tmpfile" | $FZF \
--print-query \
--reverse \
--height 90% \
--border rounded \
--prompt " " \
--pointer " " \
--marker "✓ " \
--header "SESSION MANAGER" \
--color "pointer:9,spinner:92,marker:46,fg:7,bg:-1,hl:4,fg+:15,bg+:0,hl+:12,info:8,prompt:4,border:8" \
--preview 'if [[ "{}" == "dotfiles" ]]; then
ls -la --color=always ~/dotfiles 2>/dev/null
elif [[ -d ~/Developer/{} ]]; then
ls -la --color=always ~/Developer/{} 2>/dev/null
else
echo "New directory will be created at:"
echo " ~/Developer/{}"
fi' \
--preview-window 'right:55%:border-rounded' \
--bind 'ctrl-u:preview-page-up,ctrl-d:preview-page-down,?:toggle-preview')
rm -f "$tmpfile"
query=$(echo "$fzf_output" | head -n1)
selected_name=$(echo "$fzf_output" | tail -n1)
new_folder_created=false
uv_project=false
uv_tdd_project=false
# Check if query starts with "uvtddnew:" to create a TDD Python project
if [[ $query == uvtddnew:* ]]; then
folder_name="${query#uvtddnew:}"
folder_name=$(echo "$folder_name" | xargs)
selected="$HOME/Developer/$folder_name"
if [[ ! -d $selected ]]; then
mkdir -p "$selected"
new_folder_created=true
uv_tdd_project=true
fi
# Check if query starts with "uvnew:" to create a new Python project
elif [[ $query == uvnew:* ]]; then
folder_name="${query#uvnew:}"
folder_name=$(echo "$folder_name" | xargs)
selected="$HOME/Developer/$folder_name"
if [[ ! -d $selected ]]; then
mkdir -p "$selected"
new_folder_created=true
uv_project=true
fi
# Check if query starts with "new:" to create a new folder
elif [[ $query == new:* ]]; then
folder_name="${query#new:}"
folder_name=$(echo "$folder_name" | xargs)
selected="$HOME/Developer/$folder_name"
if [[ ! -d $selected ]]; then
mkdir -p "$selected"
new_folder_created=true
fi
# Map the selected folder name back to full path
elif [[ -n $selected_name ]]; then
if [[ "$selected_name" == "dotfiles" ]]; then
selected="$HOME/dotfiles"
else
selected="$HOME/Developer/$selected_name"
fi
else
selected=""
fi
# If no selection but we have a query, use the query
if [[ -z $selected ]] && [[ -n $query ]]; then
selected="$HOME/Developer/$query"
if [[ ! -d $selected ]]; then
mkdir -p "$selected"
new_folder_created=true
fi
fi
if [[ -z $selected ]]; then
# If no selection, start or attach to a default session
if [[ -z $TMUX ]]; then
exec $TMUX_BIN new-session -A -s default
fi
exit 0
fi
# Get session name from the path
session_name=$(basename "$selected" | tr . _)
tmux_running=$(pgrep tmux)
if [[ -z $TMUX ]] && [[ -z $tmux_running ]]; then
exec $TMUX_BIN new-session -s $session_name -c $selected
fi
if [[ -z $TMUX ]]; then
# Not in tmux, so attach to existing or create new
exec $TMUX_BIN new-session -A -s $session_name -c $selected
fi
# Already in tmux, switch to the session
if ! $TMUX_BIN has-session -t=$session_name 2>/dev/null; then
$TMUX_BIN new-session -ds $session_name -c $selected
fi
$TMUX_BIN switch-client -t $session_name
# Only cd into the folder if we just created it
if [[ $new_folder_created == true ]]; then
$TMUX_BIN send-keys -t $session_name "cd \"$selected\"" C-m
# Initialize uv project if uvnew: was used
if [[ $uv_project == true ]]; then
$TMUX_BIN send-keys -t $session_name "uv init" C-m
fi
# Initialize TDD project if uvtddnew: was used
if [[ $uv_tdd_project == true ]]; then
project_name=$(basename "$selected" | tr '-' '_')
# Create directory structure in parent script (not in tmux)
mkdir -p "$selected/src/$project_name"
mkdir -p "$selected/tests"
# Create files directly in the script
cat > "$selected/src/$project_name/__init__.py" << 'EOF'
EOF
cat > "$selected/src/$project_name/main.py" << 'EOF'
def add(a, b):
return a + b
EOF
cat > "$selected/tests/__init__.py" << 'EOF'
EOF
cat > "$selected/conftest.py" << 'EOF'
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent / "src"))
EOF
cat > "$selected/tests/test_main.py" << EOF
from ${project_name}.main import add
def test_add():
assert add(1, 2) == 3
EOF
# Now initialize uv project and install dependencies in tmux
$TMUX_BIN send-keys -t $session_name "uv init && uv add --dev pytest && rm -f hello.py main.py" C-m
fi
$TMUX_BIN send-keys -t $session_name "clear" C-m
fi