diff options
-rw-r--r-- | etc/functions/rtab | 53 |
1 files changed, 45 insertions, 8 deletions
diff --git a/etc/functions/rtab b/etc/functions/rtab index bf08d00..9a1410b 100644 --- a/etc/functions/rtab +++ b/etc/functions/rtab @@ -4,11 +4,45 @@ ## 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 +typeset result part dir=${1-$PWD} typeset -i i -#typeset IFS='/' -tree=(${(s:/:)1}) + +(( pwd )) && dir=$PWD + +[[ -d $dir ]] || return 0 + +(( tilde )) && dir=${dir/$HOME/\~} +tree=(${(s:/:)dir}) ( if [[ $tree[1] = '~' ]] { shift tree @@ -18,17 +52,20 @@ tree=(${(s:/:)1}) cd / } for dir in $tree; { + if (( lastfull )) { + if [[ $dir == $tree[-1] ]] { + result+="/$tree[-1]" + break + } + } expn=(a b) part='' i=0 - # $i -gt 999 <- See CAVEAT - Onterwise we'd have an endless loop here - until [[ (( ${#expn} == 1 )) || $dir = $expn || $i -gt 999 ]] do + until [[ (( ${#expn} == 1 )) || $dir = $expn ]] do (( i++ )) part+=$dir[$i] expn=($(echo ${part}*)) -# echo "DEBUG: part=$part" -# echo "DEBUG: expn=${(j:×:)expn}" -# echo "DEBUG: dir=$dir" + (( short )) && break done result+="/$part" cd $dir |