diff options
-rw-r--r-- | zsh/.zsh/functions/rtab.zsh | 116 | ||||
-rw-r--r-- | zsh/.zshrc | 14 |
2 files changed, 128 insertions, 2 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:-/} +) + +} @@ -21,6 +21,7 @@ zstyle ':completion:*' completer _complete _ignored zstyle ':completion:*' menu select=2 zstyle :compinstall filename '~/.zshrc' zstyle '*' hosts # do not use /etc/hosts +ZDIR=~/.zsh/ # ############################################################################# # exports @@ -105,12 +106,21 @@ case `hostname` in ;; esac +source ~/.zsh/functions/rtab.zsh +psvar[1]="~" +function chpwd +{ + psvar[1]=$(rtab) +} +zstyle ':prompt:rtab' fish yes +zstyle ':prompt:rtab' nameddirs yes + case `whoami` in root) - PROMPT="%{$bg[red]%}%{$fg[black]%}%m:%~#%{$reset_color%} " + PROMPT="%{$bg[red]%}%{$fg[black]%}%m:%1v#%{$reset_color%} " ;; *) - PROMPT="%{$bg[$HOSTCOLOR_BG]%}%{$fg[$HOSTCOLOR_FG]%}%m%{$reset_color%}:%~> " + PROMPT="%{$bg[$HOSTCOLOR_BG]%}%{$fg[$HOSTCOLOR_FG]%}%m%{$reset_color%}:%1v> " ;; esac |