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