diff options
Diffstat (limited to 'zsh/.zsh')
-rw-r--r-- | zsh/.zsh/functions/rtab.zsh | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/zsh/.zsh/functions/rtab.zsh b/zsh/.zsh/functions/rtab.zsh new file mode 100644 index 0000000..ef14d41 --- /dev/null +++ b/zsh/.zsh/functions/rtab.zsh @@ -0,0 +1,116 @@ +## vim:ft=zsh +## reverse tabbing, useful in the prompt +## Copyright (C) 2008, 2009 by Daniel Friesel <derf@finalrewind.org> +## License: WTFPL <http://sam.zoy.org/wtfpl> + +## CAVEAT: directory-names containing two or more consecutive spaces +## are not yet supported + +function rtab +{ + +setopt localoptions +setopt rc_quotes null_glob + +typeset -i lastfull=0 +typeset -i short=0 +typeset -i tilde=0 +typeset -i named=0 + +if zstyle -t ':prompt:rtab' fish; then + lastfull=1 + short=1 + tilde=1 +fi +if zstyle -t ':prompt:rtab' nameddirs; then + tilde=1 + named=1 +fi +zstyle -t ':prompt:rtab' last && lastfull=1 +zstyle -t ':prompt:rtab' short && short=1 +zstyle -t ':prompt:rtab' tilde && tilde=1 + +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 Substitute ~ for the home directory' + print ' -T, --nameddirs Substitute named directories as well' + print 'The long options can also be set via zstyle, like' + print ' zstyle :prompt:rtab fish yes' + return 0 + ;; + -l|--last) lastfull=1 ;; + -s|--short) short=1 ;; + -t|--tilde) tilde=1 ;; + -T|--nameddirs) + tilde=1 + named=1 + ;; + -|--) + shift + break + ;; + esac + shift +done + +typeset -a tree expn +typeset result part dir=${1-${PWD}} +typeset -i i + +[[ -d ${dir} ]] || return 0 + +if (( named )) { + for part in ${(k)nameddirs}; { + [[ ${dir} == ${nameddirs[$part]}(/*|) ]] && dir=${dir/${nameddirs[$part]}/\~${part}} + } +} +(( tilde )) && dir=${dir/#${HOME}/\~} +tree=(${(s:/:)dir}) +( + # Start either in the currrent named directory or in / + if [[ ${tree[1]} == \~* ]] { + cd -q ${~tree[1]} + result=${tree[1]} + shift tree + } else { + cd -q / + } + for dir in ${tree}; { + if (( lastfull && ${#tree} == 1 )) { + result+="/${tree}" + break + } + + # required for the until loop + expn=(a b) + part='' + i=0 + until [[ (( ${#expn} == 1 )) || ${dir} == ${expn} || ${i} -gt 99 ]] do + (( i++ )) + part+=${dir[$i]} + expn=($(echo ${part}*(-/))) + # Never show a single . as directory + if [[ ${i} == 1 && ${dir[$i]} == . ]] { + expn=(a b) + } elif [[ ${short} == 1 ]] { + break + } + done + result+="/${part}" + cd -q ${dir} + shift tree + } + echo ${result:-/} +) + +} |