-
Notifications
You must be signed in to change notification settings - Fork 1
/
prwd.zsh
199 lines (162 loc) · 4.83 KB
/
prwd.zsh
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# ================================================
# PERSISTENT-WORKING-DIRECTORY ===================
# ================================================
# ------------------------------------------------
# GLOBALS ----------------------------------------
# ------------------------------------------------
WORKING_DIRECTORY_FILE=$HOME/.prwd-directories
# If the user has not set PRWD_BIND_TO_WORKSPACE, default to false.
if [[ -z $PRWD_BIND_TO_WORKSPACE ]] ; then
PRWD_BIND_TO_WORKSPACE=false
fi
# If the user has not set PRWD_BIND_TO_TMUX, default to false.
if [[ -z $PRWD_BIND_TO_TMUX ]] ; then
PRWD_BIND_TO_TMUX=false
fi
# ------------------------------------------------
# UTILITY ----------------------------------------
# ------------------------------------------------
function _in_tmux() {
if test -z $TMUX; then
return 1
fi
return 0
}
function _current_workspace()
{
# Clients SSHed here get their own workspace
if ( env | grep -q "^SSH_CLIENT=" ) ; then
echo "ssh"
# If the config is set to bind within tmux and we're in a tmux...
elif ( $PRWD_BIND_TO_TMUX && `_in_tmux` ) ; then
echo $TMUX | \grep -oE "([0-9]*$)"
# If the config is set to bind to a workspace...
elif ( $PRWD_BIND_TO_WORKSPACE ) ; then
wmctrl -d | grep "*" | awk '{print $1}'
# Otherwise we're "always on 'none'"
else
echo "none"
fi
}
function _get_persistent_working_directory()
{
local _target=$1
local _workspace=$2
cat $WORKING_DIRECTORY_FILE | grep -E "^$_target,$_workspace," | sed "s/^$_target,$_workspace,//"
}
# ------------------------------------------------
# COMMANDS ---------------------------------------
# ------------------------------------------------
function lw()
{
# List the current working directory
if [[ $1 == "-c" ]] ; then
_get_persistent_working_directory 0 `_current_workspace`
# We want to see a specific workspace
elif [[ -n $1 ]] ; then
_get_persistent_working_directory 0 $1
# List entire file
else
test -e $WORKING_DIRECTORY_FILE && cat $WORKING_DIRECTORY_FILE | sort
fi
}
function sw()
{
local _target=$1
local _workspace=$2
if [[ -z $_target ]] ; then
_target="none"
fi
if [[ -z $_workspace ]] ; then
_workspace=`_current_workspace`
fi
# Destroy the target if it exists
if [[ -e $WORKING_DIRECTORY_FILE ]] ; then
# macOS sed is different and takes a preliminary "backup" arg
# but the user could have GNU sed installed.
#
# The macOS sed returns an error with the --help flag passed.
if sed --help > /dev/null 2>&1; then
# GNU sed
sed -i "/^$_target,$_workspace,.*$/d" $WORKING_DIRECTORY_FILE
else
# macOS sed requires a hack. This .tmp file has to be created for
# in-place to work.
sed -i.tmp "/^$_target,$_workspace,.*$/d" $WORKING_DIRECTORY_FILE
test -f $WORKING_DIRECTORY_FILE.tmp && rm $WORKING_DIRECTORY_FILE.tmp
fi
fi
# Add it to the working directory file
echo "$_target,$_workspace,$PWD" >> $WORKING_DIRECTORY_FILE
lw -c
}
function gw()
{
local _target=$1
local _workspace="none"
local _list_target=false
# Handle --list-target if we just want to list the
# target directory and not actually cd there.
if [[ $_target == "--list-target" ]] ; then
shift
_target=$1
_list_target=true
fi
# Default to 0 if target was not passed
if [[ -z $_target ]] ; then
_target="none"
fi
# Default to 0 if we aren't binding to workspaces
if ( $PRWD_BIND_TO_WORKSPACE || $PRWD_BIND_TO_TMUX ) ; then
_workspace=`_current_workspace`
fi
if [[ -e $WORKING_DIRECTORY_FILE ]] ; then
local _directory=`_get_persistent_working_directory $_target $_workspace`
if ( $_list_target ) ; then
echo $_directory
return
fi
clear
if [[ -z $_directory ]] ; then
echo "$0: Working directory not set for target=$_target workspace=$_workspace. Changing directory to '~/'."
cd
# FIX:
if ( `(command -v g >/dev/null 2>&1)` ) ; then
g
fi
else
cd $_directory
fi
else
echo "$0: No directories are set. Changing directory to '~/'."
cd
return
fi
}
# Clear working directory file
function cw()
{
if [[ -f $WORKING_DIRECTORY_FILE ]] ; then
rm $WORKING_DIRECTORY_FILE
echo "Cleared persistent working directories."
else
echo "No persistent working directory file to clear."
fi
}
function pwd-is-wd() {
if [[ `pwd` == `gw --list-target` ]] ; then
return 0
fi
return 1
}
function _ensure_default_working_directory_file()
{
# Create the file and set a default working directory (HOME)
if [[ ! -f $WORKING_DIRECTORY_FILE ]] ; then
echo "0,0,$HOME" >> $WORKING_DIRECTORY_FILE
fi
}
# ------------------------------------------------
# MAIN -------------------------------------------
# ------------------------------------------------
#_ensure_default_working_directory_file