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 | |
parent | 4db0b10fc2f5b5c1344004cdb28ef257d8e5de85 (diff) | |
download | zsh-456e958527cc432467a09aa08abe54ff6684f351.tar.gz zsh-456e958527cc432467a09aa08abe54ff6684f351.tar.xz zsh-456e958527cc432467a09aa08abe54ff6684f351.zip |
18149, 18153: new func for emulating bash's programmable completion system
-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 + results+=( ${savejobtexts[$job]%% *} ) + done + ;; + setopt|shopt) results+=( "${(k)options[@]}" ) ;; + signal) results+=( "SIG${^signals[@]}" ) ;; + user) results+=( "${(k)userdirs[@]}" ) ;; + variable) results+=( "${(k)parameters[@]}" ) ;; + helptopic) ;; + esac + ;; + F) + COMPREPLY=() + $OPTARG "${words[0]}" "${words[CURRENT-1]}" "${words[CURRENT-2]}" + results+=( "${COMPREPLY[@]}" ) + ;; + G) + setopt nullglob + results+=( ${~OPTARG} ) + unsetopt nullglob + ;; + W) eval "results+=( $OPTARG )" ;; + C) results+=( $(eval $OPTARG) ) ;; + P) prefix="$OPTARG" ;; + S) suffix="$OPTARG" ;; + X) + if [[ ${OPTARG[0]} = '!' ]]; then + results=( "${(M)results[@]:#${OPTARG#?}}" ) + else + results=( "${results[@]:#$OPTARG}" ) + fi + ;; + esac + done + + # support for the last, `word' option to compgen. Zsh's matching does a + # better job but if you need to, comment this in and use compadd -U + #shift $(( OPTIND - 1 )) + #(( $# )) && results=( "${(M)results[@]:#$1*}" ) + + print -l -- "$prefix${^results[@]}$suffix" +} + +complete() { + emulate -L zsh + local args void cmd print remove + args=( "$@" ) + zparseopts -D -a void o: A: G: W: C: F: P: S: X: a b c d e f g j k u v \ + p=print r=remove + if [[ -n $print ]]; then + printf 'complete %2$s %1$s\n' "${(@kv)_comps[(R)_bash*]#* }" + elif [[ -n $remove ]]; then + for cmd; do + unset "_comps[$cmd]" + done + else + compdef _bash_complete\ ${(j. .)${(q)args[1,-1-$#]}} "$@" + fi +} + +unfunction bashcompinit +autoload -U bashcompinit +return 0 |