1#autoload 2 3# This completer completes filename extensions when completing 4# after *. or ^*. It can be used anywhere in the completer list 5# but if used after _expand, patterns that already match a file 6# will be expanded before it is called. 7 8compset -P '(#b)([~$][^/]#/|)(*/|)(\^|)\*.' || return 1 9 10local -aU files 11local -a expl suf mfiles 12 13files=( ${(e)~match[1]}${match[2]}*.* ) || return 1 14eval set -A files '${(MSI:'{1..${#${(O)files//[^.]/}[1]}}':)files%%.[^/]##}' 15files=( ${files:#.<->(.*|)} ) 16 17if zstyle -t ":completion:${curcontext}:extensions" prefix-hidden; then 18 files=( ${files#.} ) 19else 20 PREFIX=".$PREFIX" 21 IPREFIX="${IPREFIX%.}" 22fi 23 24zstyle -T ":completion:${curcontext}:extensions" add-space || 25 suf=( -S '' ) 26 27_description extensions expl 'file extension' 28 29# for an exact match, fail so as to give _expand or _match a chance. 30compadd -O mfiles "$expl[@]" -a files 31[[ $#mfiles -gt 1 || ${mfiles[1]} != $PREFIX ]] && 32 compadd "$expl[@]" "$suf[@]" -a files && 33 [[ -z $compstate[exact_string] ]] 34