summaryrefslogtreecommitdiff
path: root/etc
diff options
context:
space:
mode:
Diffstat (limited to 'etc')
-rw-r--r--etc/functions/rtab53
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