diff options
Diffstat (limited to 'Completion/Zsh')
-rw-r--r-- | Completion/Zsh/Type/_directory_stack | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/Completion/Zsh/Type/_directory_stack b/Completion/Zsh/Type/_directory_stack new file mode 100644 index 000000000..f79aa947f --- /dev/null +++ b/Completion/Zsh/Type/_directory_stack @@ -0,0 +1,51 @@ +#compdef popd + +# This just completes the numbers after +, showing the full directory list +# with numbers. For - we do the same thing, but reverse the numbering (other +# way round if pushdminus is set). Note that this function is also called +# from _cd for cd and pushd. + +setopt localoptions nonomatch + +local expl list lines revlines disp suf + +if [[ "$SUFFIX" = */* ]]; then + ISUFFIX="/${SUFFIX#*/}$ISUFFIX" + SUFFIX="${SUFFIX%%/*}" + suf=(-S '') +else + suf=(-qS/) +fi + +### we decided against this, for now... +#! zstyle -T ":completion:${curcontext}:directory-stack" prefix-needed || + +[[ $PREFIX = [-+]* ]] || return 1 + +if zstyle -T ":completion:${curcontext}:directory-stack" verbose; then + # get the list of directories with their canonical number + # and turn the lines into an array, removing the current directory + lines=("${dirstack[@]}") + + if [[ ( $PREFIX[1] = - && ! -o pushdminus ) || + ( $PREFIX[1] = + && -o pushdminus ) ]]; then + integer i + revlines=( $lines ) + for (( i = 1; i <= $#lines; i++ )); do + lines[$i]="$((i-1)) -- ${revlines[-$i]##[0-9]#[ ]#}" + done + else + for (( i = 1; i <= $#lines; i++ )); do + lines[$i]="$i -- ${lines[$i]##[0-9]#[ ]#}" + done + fi + # get the array of numbers only + list=( ${PREFIX[1]}${^lines%% *} ) + disp=( -ld lines ) +else + list=( ${PREFIX[1]}{0..${#dirstack}} ) + disp=() +fi + +_wanted -V directory-stack expl 'directory stack' \ + compadd "$@" "$suf[@]" "$disp[@]" -Q -a list |