diff options
| author | Oliver Kiddle <opk@users.sourceforge.net> | 2003-01-29 14:26:01 +0000 |
|---|---|---|
| committer | Oliver Kiddle <opk@users.sourceforge.net> | 2003-01-29 14:26:01 +0000 |
| commit | 456e958527cc432467a09aa08abe54ff6684f351 (patch) | |
| tree | efea7b6bfd525b298aa87a39768a55859e48767c /Completion/bashcompinit | |
| parent | 18156: use reply array instead of ali for plugins and document new styles (diff) | |
| download | zsh-456e958527cc432467a09aa08abe54ff6684f351.tar zsh-456e958527cc432467a09aa08abe54ff6684f351.tar.gz zsh-456e958527cc432467a09aa08abe54ff6684f351.tar.bz2 zsh-456e958527cc432467a09aa08abe54ff6684f351.tar.lz zsh-456e958527cc432467a09aa08abe54ff6684f351.tar.xz zsh-456e958527cc432467a09aa08abe54ff6684f351.tar.zst zsh-456e958527cc432467a09aa08abe54ff6684f351.zip | |
18149, 18153: new func for emulating bash's programmable completion system
Diffstat (limited to 'Completion/bashcompinit')
| -rw-r--r-- | Completion/bashcompinit | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/Completion/bashcompinit b/Completion/bashcompinit new file mode 100644 index 000000000..5166b0368 --- /dev/null +++ b/Completion/bashcompinit @@ -0,0 +1,172 @@ +#autoload + +_bash_complete() { + local ret=1 + local -a suf matches + local COMP_POINT COMP_CWORD + local -a COMP_WORDS COMPREPLY BASH_VERSINFO + local COMP_LINE="$words" + local -A savejobstates savejobtexts + + (( COMP_POINT = 1 + ${#${(j. .)words[1,CURRENT-1]}} + $#QIPREFIX + $#IPREFIX + $#PREFIX )) + (( COMP_CWORD = CURRENT - 1)) + COMP_WORDS=( $words ) + BASH_VERSINFO=( 2 05b 0 1 release ) + + savejobstates=( ${(kv)jobstates} ) + savejobtexts=( ${(kv)jobtexts} ) + + [[ ${argv[${argv[(I)nospace]:-0}-1]} = -o ]] && suf=( -S '' ) + + matches=( ${(f)"$(compgen $@)"} ) + + if [[ -n $matches ]]; then + if [[ ${argv[${argv[(I)filenames]:-0}-1]} = -o ]]; then + compset -P '*/' && matches=( ${matches##*/} ) + compset -S '/*' && matches=( ${matches%%/*} ) + compadd -f "${suf[@]}" -a matches && ret=0 + else + compadd "${suf[@]}" -a matches && ret=0 + fi + fi + + if (( ret )); then + if [[ ${argv[${argv[(I)default]:-0}-1]} = -o ]]; then + _default "${suf[@]}" && ret=0 + elif [[ ${argv[${argv[(I)dirnames]:-0}-1]} = -o ]]; then + _directories "${suf[@]}" && ret=0 + fi + fi + + return ret +} + +compgen() { + local opts prefix suffix job OPTARG OPTIND ret=1 + local -a name res results jids + local -A shortopts + + emulate -L sh + setopt kshglob noshglob braceexpand nokshautoload + + shortopts=( + a alias b builtin c command d directory e export f file + g group j job k keyword u user v variable + ) + + while getopts "o:A:G:C:F:P:S:W:X:abcdefgjkuv" name; do + case $name in + [abcdefgjkuv]) OPTARG="${shortopts[$name]}" ;& + A) + case $OPTARG in + alias) results+=( "${(k)aliases[@]}" ) ;; + arrayvar) results+=( "${(k@)parameters[(R)array*]}" ) ;; + binding) results+=( "${(k)widgets[@]}" ) ;; + builtin) results+=( "${(k)builtins[@]}" "${(k)dis_builtins[@]}" ) ;; + command) + results+=( + "${(k)commands[@]}" "${(k)aliases[@]}" "${(k)builtins[@]}" + "${(k)functions[@]}" "${(k)reswords[@]}" + ) + ;; + directory) + setopt bareglobqual + results+=( ${IPREFIX}${PREFIX}*${SUFFIX}${ISUFFIX}(N-/) ) + setopt nobareglobqual + ;; + disabled) results+=( "${(k)dis_builtins[@]}" ) ;; + enabled) results+=( "${(k)builtins[@]}" ) ;; + export) results+=( "${(k)parameters[(R)*export*]}" ) ;; + file) + setopt bareglobqual + results+=( ${IPREFIX}${PREFIX}*${SUFFIX}${ISUFFIX}(N) ) + setopt nobareglobqual + ;; + function) results+=( "${(k)functions[@]}" ) ;; + group) + emulate zsh + _groups -U -O res + emulate sh + setopt kshglob noshglob braceexpand + results+=( "${res[@]}" ) + ;; + hostname) + emulate zsh + _hosts -U -O res + emulate sh + setopt kshglob noshglob braceexpand + results+=( "${res[@]}" ) + ;; + job) results+=( "${savejobtexts[@]%% *}" );; + keyword) results+=( "${(k)reswords[@]}" ) ;; + running) + jids=( "${(@k)savejobstates[(R)running*]}" ) + for job in "${jids[@]}"; do + results+=( ${savejobtexts[$job]%% *} ) + done + ;; + stopped) + jids=( "${(@k)savejobstates[(R)suspended*]}" ) + for job in "${jids[@]}"; do |
