blob: 360e551d3f39e3f4c997a8bb6cd7ab726906a5e0 (
plain)
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
|
## vim:ft=zsh
## reverse tabbing
## written 2008 by Daniel Friesel <derf@derf.homelinux.org>
## https://derf.homelinux.org/~derf/dotfiles/zsh/functions/rtab
## CAVEAT: directory-names containing two or more consecutive spaces
## are not yet supported
setopt localoptions
setopt rc_quotes null_glob
typeset lastfull=0
typeset short=0
typeset tilde=0
while [[ $1 == -* ]]; do
case $1 in
-f|--fish)
lastfull=1
short=1
tilde=1
;;
-h|--help)
print 'Usage: rtab [-f -l -s -t] [directory]'
print ' -f, --fish fish-simulation, like -l -s -t'
print ' -l, --last Print the last directory''s full name'
print ' -s, --short Truncate directory names to the first character'
print ' -t, --tilde Print ~ for the home directory'
return 0
;;
-l|--last) lastfull=1 ;;
-s|--short) short=1 ;;
-t|--tilde) tilde=1 ;;
esac
shift
done
typeset -a tree expn
typeset result part dir=${1-$PWD}
typeset -i i
[[ -d $dir ]] || return 0
(( tilde )) && dir=${dir/$HOME/\~}
tree=(${(s:/:)dir})
(
unfunction chpwd 2> /dev/null
if [[ $tree[1] = '~' ]] {
shift tree
cd ~
result='~'
} else {
cd /
}
for dir in $tree; {
if (( lastfull )) {
if [[ $dir == $tree[-1] ]] {
result+="/$tree[-1]"
break
}
}
expn=(a b)
part=''
i=0
until [[ (( ${#expn} == 1 )) || $dir = $expn || $i -gt 99 ]] do
(( i++ ))
part+=$dir[$i]
expn=($(echo ${part}*(/)))
(( short )) && break
done
result+="/$part"
cd $dir
}
echo $result
)
|