summaryrefslogtreecommitdiff
path: root/zsh/.zsh/functions
diff options
context:
space:
mode:
Diffstat (limited to 'zsh/.zsh/functions')
-rw-r--r--zsh/.zsh/functions/rtab.zsh116
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:-/}
+)
+
+}