Skip to content

Commit 3cc211b

Browse files
committed
Rework ap, ip, and rp some more.
1 parent 50d622e commit 3cc211b

File tree

2 files changed

+182
-145
lines changed

2 files changed

+182
-145
lines changed

.bashrc.funcs

+173-130
Original file line numberDiff line numberDiff line change
@@ -5,88 +5,109 @@
55
# If `after` is given, the dir is inserted after `after` in the `var`
66
# instead of at the end of var.
77
function ap() {
8-
local OPTARG OPTIND after= dir= nonempty=0 var=PATH verbose=0
8+
local OPTARG OPTIND append after= dir= nonempty=0
9+
local usage var=PATH vecho verbose=0
910

10-
ap_usage() {
11-
echo "usage: ap [-nv] [-p var] [ after ] dir"
11+
function usage() {
12+
echo "usage: ap [-nv] [ -a after ] [-p var] dir..."
1213
echo ""
1314
echo " -n only add if the directory is not empty"
1415
echo " -v be verbose about what we do"
1516
}
1617

17-
vecho() {
18+
function vecho() {
1819
if [[ $verbose -eq 1 ]] ; then
1920
echo "$@"
2021
fi
2122
}
2223

23-
while getopts "hnp:v" opt
24+
function append() {
25+
local dir="$1"
26+
27+
if [[ ("${!var}" =~ ":${dir}:") || ("${!var}" =~ ^"${dir}:") || \
28+
("${!var}" =~ ":${dir}"$) ]]
29+
then
30+
vecho "${dir} is already in the ${var}"
31+
return
32+
fi
33+
34+
if [[ ! -d "${dir}" ]]; then
35+
vecho "${dir} doesn't exist"
36+
return
37+
fi
38+
39+
if [[ ${nonempty} -eq 1 ]]; then
40+
local dotglob=0
41+
if [[ "$(shopt dotglob)" =~ on ]]; then
42+
dotglob=1
43+
fi
44+
shopt -s dotglob
45+
if [[ $(echo -n "$dir/*") = "$dir/*" ]]; then
46+
vecho "${dir} is empty, not adding to ${var}"
47+
if [[ $dotglob = 0 ]]; then
48+
shopt -u dotglob
49+
fi
50+
return
51+
else
52+
if [[ $dotglob = 0 ]]; then
53+
shopt -u dotglob
54+
fi
55+
fi
56+
fi
57+
58+
if [[ "${after}" == "" ]]; then
59+
export ${var}="${!var}:${dir}"
60+
vecho "${dir} appended to ${var}"
61+
return
62+
fi
63+
64+
if [[ ( "${!var}" = "${after}" ) || ( "${!var}" =~ ^"${after}:" ) ]] then
65+
export ${var}=${!var/${after}/"${after}:${dir}"}
66+
vecho "${dir} added to ${var} after ${after}"
67+
elif [[ "${!var}" =~ ":${after}:" ]] then
68+
export ${var}=${!var/:${after}:/:"${after}:${dir}":}
69+
vecho "${dir} added to ${var} after ${after}"
70+
elif [[ "${!var}" =~ ":${after}"$ ]] then
71+
export ${var}=${!var/:${after}/:"${after}:${dir}"}
72+
vecho "${dir} added to ${var} after ${after}"
73+
else
74+
vecho "${after} isn't in the ${var}"
75+
fi
76+
}
77+
78+
while getopts "a:hnp:v" opt
2479
do
2580
case ${opt} in
81+
a) after=${OPTARG} ;;
2682
n) nonempty=1 ;;
2783
p) var=${OPTARG} ;;
2884
v) verbose=1 ;;
2985
h | ?)
30-
ap_usage
86+
usage
3187
return
3288
;;
3389
esac
3490
done
3591

3692
shift $(( $OPTIND - 1))
37-
if [[ $# -eq 2 ]]; then
38-
after=$1
39-
dir=$2
40-
elif [[ $# -eq 1 ]]; then
41-
dir=$1
42-
else
43-
ap_usage
44-
return
45-
fi
4693

47-
if [[ ("${!var}" =~ ":${dir}:") || ("${!var}" =~ ^"${dir}:") || \
48-
("${!var}" =~ ":${dir}"$) ]]
49-
then
50-
vecho "${dir} is already in the ${var}"
94+
if [[ $# -eq 0 ]]; then
95+
usage
5196
return
5297
fi
5398

54-
if [[ ! -d "${dir}" ]]; then
55-
vecho "${dir} doesn't exist"
56-
return
99+
if [[ ("${!var}" == "") && ("${after}" == "") ]]; then
100+
export ${var}="$1"
101+
shift
57102
fi
58103

59-
if [[ ${nonempty} -eq 1 ]]; then
60-
local dotglob=0
61-
if [[ "$(shopt dotglob)" =~ on ]]; then
62-
dotglob=1
104+
while [[ $# -gt 0 ]]; do
105+
if [[ -d "$1" ]]; then
106+
append "$1"
107+
after="$1"
63108
fi
64-
shopt -s dotglob
65-
if [[ $(echo -n "$dir/*") = "$dir/*" ]]; then
66-
vecho "${dir} is empty, not adding to ${var}"
67-
if [[ $dotglob = 0 ]]; then
68-
shopt -u dotglob
69-
fi
70-
return
71-
else
72-
if [[ $dotglob = 0 ]]; then
73-
shopt -u dotglob
74-
fi
75-
fi
76-
fi
77-
78-
if [[ "${after}" == "" ]]; then
79-
export ${var}="${!var}:${dir}"
80-
vecho "${dir} appended to ${var}"
81-
return
82-
fi
83-
84-
if [[ "${!var}" =~ "${after}" ]]; then
85-
export ${var}="${!var/${after}/"${after}:${dir}"}"
86-
vecho "${dir} added to ${var} after ${after}"
87-
else
88-
vecho "${after} isn't in the ${var}"
89-
fi
109+
shift
110+
done
90111
}
91112

92113
function and() {
@@ -172,18 +193,20 @@ function home() {
172193
cd "$HOME/$@"
173194
}
174195

175-
# ip - insert directory `dir` at the front of the `var` env variable if it's
176-
# not already there and `dir` exists.
196+
# ip - insert directories `dir` at the front of the `var` env variable if
197+
# they are not already in `var` and they exist.
177198
# `var` defaults to PATH if not given
199+
# `-b` inserts before `before` in `var`, rather than at the very
200+
# front of `var`.
178201
# `-n` requires `dir` to be nonempty
179202
# `-v` be verbose about what happens
180-
# If `before` is given, the dir is inserted before `before` instead
181-
# of at the front of var.
182203
function ip() {
183-
local OPTARG OPTIND before= dir= nonempty=0 usage var=PATH vecho verbose=0
204+
local OPTARG OPTIND before= dir= nonempty=0 prepend usage var=PATH vecho
205+
local opt_nonempty opt_v
206+
local verbose=0
184207

185208
usage() {
186-
echo "usage: ip [-nv] [-p var] dir [ before ]"
209+
echo "usage: ip [-nv] [ -b before ] [-p var] dir..."
187210
echo ""
188211
echo " -n only add if the directory is not empty"
189212
echo " -v be verbose about what we do"
@@ -195,12 +218,63 @@ function ip() {
195218
fi
196219
}
197220

198-
while getopts "hnp:v" opt
221+
function prepend () {
222+
local dir="$1"
223+
224+
if [[ ("${!var}" =~ ":${dir}:") || ("${!var}" =~ ^"${dir}:") || \
225+
("${!var}" =~ ":${dir}"$) ]]
226+
then
227+
vecho "${dir} is already in the ${var}"
228+
return
229+
fi
230+
231+
if [[ ! -d "${dir}" ]]; then
232+
vecho "${dir} doesn't exist"
233+
return
234+
fi
235+
236+
if [[ ${nonempty} -eq 1 ]]; then
237+
local dotglob=0
238+
if [[ "$(shopt dotglob)" =~ on ]]; then
239+
dotglob=1
240+
fi
241+
shopt -s dotglob
242+
if [[ $(echo -n "$dir/*") = "$dir/*" ]]; then
243+
vecho "${dir} is empty, not adding to ${var}"
244+
if [[ $dotglob = 0 ]]; then
245+
shopt -u dotglob
246+
fi
247+
return
248+
else
249+
if [[ $dotglob = 0 ]]; then
250+
shopt -u dotglob
251+
fi
252+
fi
253+
fi
254+
255+
if [[ "${before}" == "" ]]; then
256+
export ${var}="${dir}:${!var}"
257+
vecho "${dir} prepended to ${var}"
258+
return
259+
fi
260+
261+
if [[ "${!var}" =~ "${before}" ]]; then
262+
export ${var}="${!var/${before}/"${dir}:${before}"}"
263+
vecho "${dir} added to ${var} before ${before}"
264+
else
265+
vecho "${before} isn't in the ${var}"
266+
fi
267+
268+
return
269+
}
270+
271+
while getopts "b:hnp:v" opt
199272
do
200273
case ${opt} in
201-
n) nonempty=1 ;;
274+
b) before=${OPTARG} ;;
275+
n) nonempty=1 ; opt_nonempty="-n";;
202276
p) var=${OPTARG} ;;
203-
v) verbose=1 ;;
277+
v) verbose=1 ; opt_v="-v" ;;
204278
h | ?)
205279
usage
206280
return
@@ -209,61 +283,24 @@ function ip() {
209283
done
210284

211285
shift $(( $OPTIND - 1))
212-
if [[ $# -eq 2 ]]; then
213-
dir=$1
214-
before=$2
215-
elif [[ $# -eq 1 ]]; then
216-
dir=$1
217-
else
286+
if [[ $# -eq 0 ]]; then
218287
usage
219288
return
220289
fi
221290

222-
if [[ ("${!var}" =~ ":${dir}:") || ("${!var}" =~ ^"${dir}:") || \
223-
("${!var}" =~ ":${dir}"$) ]]
224-
then
225-
vecho "${dir} is already in the ${var}"
226-
return
227-
fi
228-
229-
if [[ ! -d "${dir}" ]]; then
230-
vecho "${dir} doesn't exist"
231-
return
232-
fi
233-
234-
if [[ ${nonempty} -eq 1 ]]; then
235-
local dotglob=0
236-
if [[ "$(shopt dotglob)" =~ on ]]; then
237-
dotglob=1
238-
fi
239-
shopt -s dotglob
240-
if [[ $(echo -n "$dir/*") = "$dir/*" ]]; then
241-
vecho "${dir} is empty, not adding to ${var}"
242-
if [[ $dotglob = 0 ]]; then
243-
shopt -u dotglob
244-
fi
245-
return
246-
else
247-
if [[ $dotglob = 0 ]]; then
248-
shopt -u dotglob
249-
fi
250-
fi
251-
fi
252-
253-
if [[ "${before}" == "" ]]; then
254-
export ${var}="${dir}:${!var}"
255-
vecho "${dir} prepended to ${var}"
256-
return
257-
fi
291+
first="$1"
258292

259-
if [[ "${!var}" =~ "${before}" ]]; then
260-
export ${var}="${!var/${before}/"${dir}:${before}"}"
261-
vecho "${dir} added to ${var} before ${before}"
293+
if [[ ("${!var}" == "") && ("${after}" == "") ]]; then
294+
export ${var}="${first}"
295+
shift
262296
else
263-
vecho "${before} isn't in the ${var}"
297+
prepend "${first}"
298+
shift
264299
fi
265300

266-
return
301+
if [[ $# -gt 0 ]]; then
302+
ap -a "${first}" -p "${var}" $opt_nonempty $opt_v "$@"
303+
fi
267304
}
268305

269306
alias ls='ls -F'
@@ -299,36 +336,42 @@ function repeat() {
299336
done
300337
}
301338

302-
# rp - remove path component
303-
# usage: rp [var] component
339+
# rp - remove directories from path-like env var
340+
# usage: rp [-p var] dir...
304341
function rp() {
305-
# set -x
306342
local comp var
343+
307344
if [ $# -eq 2 ]
308345
then
309-
var=$1
346+
var="$1"
310347
shift
311348
else
312349
var=PATH
313350
fi
314-
comp=$1
315-
if [[ "${!var}" =~ ^"$1:" ]]
316-
then
317-
# front
318-
export ${var}=${!var/#$comp:/}
319-
elif [[ "${!var}" =~ ":$1:" ]]
320-
then
321-
# middle
322-
export ${var}=${PATH/:$comp:/:}
323-
elif [[ "${!var}" =~ ":$1"$ ]]
324-
then
325-
# end
326-
export ${var}=${!var/%:$comp/}
327-
else
328-
# not found
329-
:
330-
fi
331-
# set +x
351+
352+
while [[ $# -gt 0 ]]; do
353+
comp="$1"
354+
if [[ "${!var}" = "${comp}" ]]
355+
then
356+
export ${!var}=
357+
elif [[ "${!var}" =~ ^"${comp}:" ]]
358+
then
359+
# front
360+
export ${var}=${!var/#${comp}:/}
361+
elif [[ "${!var}" =~ ":${comp}:" ]]
362+
then
363+
# middle
364+
export ${var}=${PATH/:${comp}:/:}
365+
elif [[ "${!var}" =~ ":${comp}"$ ]]
366+
then
367+
# end
368+
export ${var}=${!var/%:$comp/}
369+
else
370+
# not found
371+
:
372+
fi
373+
shift
374+
done
332375
}
333376

334377

0 commit comments

Comments
 (0)