1#autoload
2
3_bash_complete() {
4  local ret=1
5  local -a suf matches
6  local COMP_POINT COMP_CWORD
7  local -a COMP_WORDS COMPREPLY BASH_VERSINFO
8  local COMP_LINE="$words"
9  local -A savejobstates savejobtexts
10
11  (( COMP_POINT = 1 + ${#${(j. .)words[1,CURRENT]}} + $#QIPREFIX + $#IPREFIX + $#PREFIX ))
12  (( COMP_CWORD = CURRENT - 1))
13  COMP_WORDS=( $words )
14  BASH_VERSINFO=( 2 05b 0 1 release )
15
16  savejobstates=( ${(kv)jobstates} )
17  savejobtexts=( ${(kv)jobtexts} )
18
19  [[ ${argv[${argv[(I)nospace]:-0}-1]} = -o ]] && suf=( -S '' )
20
21  matches=( ${(f)"$(compgen $@ -- ${words[CURRENT]})"} )
22
23  if [[ -n $matches ]]; then
24    if [[ ${argv[${argv[(I)filenames]:-0}-1]} = -o ]]; then
25      compset -P '*/' && matches=( ${matches##*/} )
26      compset -S '/*' && matches=( ${matches%%/*} )
27      compadd -Q -f "${suf[@]}" -a matches && ret=0
28    else
29      compadd -Q "${suf[@]}" -a matches && ret=0
30    fi
31  fi
32
33  if (( ret )); then
34    if [[ ${argv[${argv[(I)default]:-0}-1]} = -o ]]; then
35      _default "${suf[@]}" && ret=0
36    elif [[ ${argv[${argv[(I)dirnames]:-0}-1]} = -o ]]; then
37      _directories "${suf[@]}" && ret=0
38    fi
39  fi
40
41  return ret
42}
43
44compgen() {
45  local opts prefix suffix job OPTARG OPTIND ret=1
46  local -a name res results jids
47  local -A shortopts
48
49  # words changes behavior: words[1] -> words[0]
50  emulate -L sh
51  setopt kshglob noshglob braceexpand nokshautoload
52
53  shortopts=(
54    a alias b builtin c command d directory e export f file
55    g group j job k keyword u user v variable
56  )
57
58  while getopts "o:A:G:C:F:P:S:W:X:abcdefgjkuv" name; do
59    case $name in
60      [abcdefgjkuv]) OPTARG="${shortopts[$name]}" ;&
61      A)
62        case $OPTARG in
63	  alias) results+=( "${(k)aliases[@]}" ) ;;
64	  arrayvar) results+=( "${(k@)parameters[(R)array*]}" ) ;;
65	  binding) results+=( "${(k)widgets[@]}" ) ;;
66	  builtin) results+=( "${(k)builtins[@]}" "${(k)dis_builtins[@]}" ) ;;
67	  command)
68	    results+=(
69	      "${(k)commands[@]}" "${(k)aliases[@]}" "${(k)builtins[@]}"
70	      "${(k)functions[@]}" "${(k)reswords[@]}"
71	    )
72	  ;;
73	  directory)
74	    setopt bareglobqual
75	    results+=( ${IPREFIX}${PREFIX}*${SUFFIX}${ISUFFIX}(N-/) )
76	    setopt nobareglobqual
77	  ;;
78	  disabled) results+=( "${(k)dis_builtins[@]}" ) ;;
79	  enabled) results+=( "${(k)builtins[@]}" ) ;;
80	  export) results+=( "${(k)parameters[(R)*export*]}" ) ;;
81	  file)
82	    setopt bareglobqual
83	    results+=( ${IPREFIX}${PREFIX}*${SUFFIX}${ISUFFIX}(N) )
84	    setopt nobareglobqual
85	  ;;
86	  function) results+=( "${(k)functions[@]}" ) ;;
87	  group)
88	    emulate zsh
89	    _groups -U -O res
90	    emulate sh
91	    setopt kshglob noshglob braceexpand
92	    results+=( "${res[@]}" )
93	  ;;
94	  hostname)
95	    emulate zsh
96	    _hosts -U -O res
97	    emulate sh
98	    setopt kshglob noshglob braceexpand
99	    results+=( "${res[@]}" )
100	  ;;
101	  job) results+=( "${savejobtexts[@]%% *}" );;
102	  keyword) results+=( "${(k)reswords[@]}" ) ;;
103	  running)
104	    jids=( "${(@k)savejobstates[(R)running*]}" )
105	    for job in "${jids[@]}"; do
106	      results+=( ${savejobtexts[$job]%% *} )
107	    done
108	  ;;
109	  stopped)
110	    jids=( "${(@k)savejobstates[(R)suspended*]}" )
111	    for job in "${jids[@]}"; do
112	      results+=( ${savejobtexts[$job]%% *} )
113	    done
114	  ;;
115	  setopt|shopt) results+=( "${(k)options[@]}" ) ;;
116	  signal) results+=( "SIG${^signals[@]}" ) ;;
117	  user) results+=( "${(k)userdirs[@]}" ) ;;
118      	  variable) results+=( "${(k)parameters[@]}" ) ;;
119	  helptopic) ;;
120	esac
121      ;;
122      F)
123        COMPREPLY=()
124        local -a args
125        args=( "${words[0]}" "${@[-1]}" "${words[CURRENT-2]}" )
126        (){
127          # There may be more things we need to add to this typeset to
128          # protect bash functions from compsys special variable names
129          typeset -h words
130          $OPTARG "${args[@]}"
131        }
132	results+=( "${COMPREPLY[@]}" )
133      ;;
134      G)
135        setopt nullglob
136        results+=( ${~OPTARG} )
137	unsetopt nullglob
138      ;;
139      W) results+=( ${(Q)~=OPTARG} ) ;;
140      C) results+=( $(eval $OPTARG) ) ;;
141      P) prefix="$OPTARG" ;;
142      S) suffix="$OPTARG" ;;
143      X)
144        if [[ ${OPTARG[0]} = '!' ]]; then
145	  results=( "${(M)results[@]:#${OPTARG#?}}" )
146	else
147 	  results=( "${results[@]:#$OPTARG}" )
148	fi
149      ;;
150    esac
151  done
152  
153  # support for the last, `word' option to compgen. Zsh's matching does a
154  # better job but if you need to, comment this in and use compadd -U
155  # (( $# >= OPTIND)) && results=( "${(M)results[@]:#${@[-1]}*}" )
156
157  print -l -r -- "$prefix${^results[@]}$suffix"
158}
159
160complete() {
161  emulate -L zsh
162  local args void cmd print remove
163  args=( "$@" )
164  zparseopts -D -a void o: A: G: W: C: F: P: S: X: a b c d e f g j k u v \
165      p=print r=remove
166  if [[ -n $print ]]; then
167    printf 'complete %2$s %1$s\n' "${(@kv)_comps[(R)_bash*]#* }"
168  elif [[ -n $remove ]]; then
169    for cmd; do
170      unset "_comps[$cmd]"
171    done
172  else
173    compdef _bash_complete\ ${(j. .)${(q)args[1,-1-$#]}} "$@"
174  fi
175}
176
177unfunction bashcompinit
178autoload -Uz bashcompinit
179return 0
180