aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver Kiddle <opk@users.sourceforge.net>2003-01-29 14:26:01 +0000
committerOliver Kiddle <opk@users.sourceforge.net>2003-01-29 14:26:01 +0000
commit456e958527cc432467a09aa08abe54ff6684f351 (patch)
treeefea7b6bfd525b298aa87a39768a55859e48767c
parent4db0b10fc2f5b5c1344004cdb28ef257d8e5de85 (diff)
downloadzsh-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/bashcompinit172
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