Parent directory

_scd

2053 bytes
 1#compdef scd
 2#description smart change directory
 3
 4local curcontext="$curcontext" state line expl ret=1
 5typeset -A opt_args
 6
 7local -a indexopts myargs
 8indexopts=( --add -a --unindex )
 9
10myargs=(
11    # common options
12    "(--help -h)"{--help,-h}"[print help and exit]"
13
14    # options for manipulating directory index
15    - 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 -/ }"
20
21    # define new directory alias
22    - alias
23    "--alias=[create alias for this or given directory]:directory-alias:()"
24    '1:directory:{ (( words[(I)--alias*] )) && _path_files -/ }'
25
26    # remove definition of directory alias
27    - unalias
28    "--unalias[remove definition of directory alias]"
29    "*::directory alias:->scd-alias-target"
30
31    # act on the directory change
32    - scd
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"
38    "*:patterns:()"
39)
40
41_arguments -S -C $myargs && ret=0
42
43
44if [[ "$state" == scd-alias-target && -s ~/.scdalias.zsh ]]; then
45    local -a scdaliases
46    scdaliases=( )
47    eval "$(setopt extendedglob
48            phome="(#b)(#s)${HOME}(/*)#(#e)"
49            builtin hash -dr
50            source ~/.scdalias.zsh &&
51            for k v in ${(kv)nameddirs}; do
52                scdaliases+=( $k:${v/${~phome}/"~"${match[1]}} )
53            done
54            complete_unalias=${+opt_args[unalias---unalias]}
55            if (( complete_unalias && ! ${+nameddirs[OLD]} )); then
56                scdaliases+=( 'OLD:all aliases to non-existent paths' )
57            fi
58            typeset -p scdaliases )"
59    _describe -t scdaliases scdalias scdaliases
60fi