2 #description smart change directory
4 local curcontext="$curcontext" state line expl ret=1
7 local -a indexopts myargs
8 indexopts=( --add -a --unindex )
12 "(--help -h)"{--help,-h}"[print help and exit]"
14 # options for manipulating directory index
16 "(--recursive -r)"{--recursive,-r}"[use recursive --add or --unindex]"
17 "($indexopts)"{--add,-a}"[add specified directories to the index]"
18 "($indexopts)--unindex[remove specified directories from the index]"
19 "*:directory:{ (( ${words[(I)-a|--add|--unindex]} )) && _path_files -/ }"
21 # define new directory alias
23 "--alias=[create alias for this or given directory]:directory-alias:()"
24 '1:directory:{ (( words[(I)--alias*] )) && _path_files -/ }'
26 # remove definition of directory alias
28 "--unalias[remove definition of directory alias]"
29 "*::directory alias:->scd-alias-target"
31 # act on the directory change
33 "(--all -A)"{--all,-A}"[include less likely and ignored paths]"
34 "--list[print matching directories and exit]"
35 "(--verbose -v)"{--verbose,-v}"[show directory ranking and full paths]"
36 "(--push -p)"{--push,-p}"[change directory with 'pushd']"
37 "1::directory alias:->scd-alias-target"
41 _arguments -S -C $myargs && ret=0
44 if [[ "$state" == scd-alias-target && -s ~/.scdalias.zsh ]]; then
47 eval "$(setopt extendedglob
48 phome="(#b)(#s)${HOME}(/*)#(#e)"
50 source ~/.scdalias.zsh &&
51 for k v in ${(kv)nameddirs}; do
52 scdaliases+=( $k:${v/${~phome}/"~"${match[1]}} )
54 complete_unalias=${+opt_args[unalias---unalias]}
55 if (( complete_unalias && ! ${+nameddirs[OLD]} )); then
56 scdaliases+=( 'OLD:all aliases to non-existent paths' )
58 typeset -p scdaliases )"
59 _describe -t scdaliases scdalias scdaliases