## vim:ft=zsh ## Needs an absolute directory path as argument ## May not contain ~ or named directories ## 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 ' -t, --tilde Print ~ for the home directory' print ' -f, --fish fish-simulation, like -l -s' print ' -l, --last Print the last directory''s full name' print ' -s, --short Truncate directory names to the first character' 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 (( pwd )) && dir=$PWD [[ -d $dir ]] || return 0 (( tilde )) && dir=${dir/$HOME/\~} tree=(${(s:/:)dir}) ( 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 ]] do (( i++ )) part+=$dir[$i] expn=($(echo ${part}*)) (( short )) && break done result+="/$part" cd $dir } echo $result )