about summary refs log tree commit diff
path: root/Completion/Core/_files
blob: d4eb2b7db37acb9f76191e8c29e82a56b48fe97c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#autoload

local opts tmp glob pats tags expl tag ret=1 i pat descr minus
local _comp_default_tags

zparseopts -a opts \
    '/=tmp' 'f=tmp' 'g+:-=tmp' q n 1 2 P: S: r: R: W: X+: M+: F: J+: V+:

type="${(@j::M)${(@)tmp#-}#?}"
(( $tmp[(I)-g*] )) && glob="${(j: :)${(M)tmp:#-g*}#-g}"

if zstyle -a ":completion:${curcontext}:" file-patterns pats; then
  [[ "$type" = */* ]] && glob="$glob *(-/)"
  pats=( \ ${(M)^${pats/#:/ ${glob:-\*}:}:#*[^\\]:*} )
else
  if [[ "$type" = *g* ]]; then
    if [[ "$type" = */* ]]; then
      pats=( " ${glob//:/\\:} *(-/):globbed-files" '*:all-files' )
    else
      pats=( " ${glob//:/\\:}:globbed-files"
             '*(-/):directories' '*:all-files' )
    fi
  elif [[ "$type" = */* ]]; then
    pats=( '*(-/):directories' '*:all-files' )
  else
    pats=( '*:all-files' )
  fi
fi

tags=( "${(@)${(@)pats#*[^\\]:}%%:*}" )
_comp_default_tags=( "$tags[@]" )

_tags "$tags[@]"

while _tags; do

  for tag in "$tags[@]"; do

    if _requested "$tag"; then

      i="$pats[(I)*[^\\\\]:${tag}(|:*)]"
      pat="${${pats[i]%%:${tag}*}//\\\\:/:}"

      if [[ i -gt 0 && "$pat" != \ # ]]; then
        if [[ "$pats[i]" = *:${tag}:* ]]; then
          descr="${pats[i]#*:${tag}:}"
          minus=()
        else
          descr=file
	  minus=(-)
        fi
        _loop "$tag" expl "$descr" \
            _path_files -g "$pat" "$opts[@]" "$minus[@]" && ret=0
      fi
    fi
  done

  (( ret )) || return 0
done

return 1