1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-05-07 16:16:17 +02:00
zsh/Completion/bashcompinit

181 lines
5.0 KiB
Plaintext

#autoload
_bash_complete() {
local ret=1
local -a suf matches
local -x COMP_POINT COMP_CWORD
local -a COMP_WORDS COMPREPLY BASH_VERSINFO
local -x 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 $@ -- ${words[CURRENT]})"} )
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[@]}" - "${(@)${(Q@)matches}:#*\ }" && ret=0
compadd -S ' ' - ${${(M)${(Q)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
# words changes behavior: words[1] -> words[0]
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=()
local -a args
args=( "${words[0]}" "${@[-1]}" "${words[CURRENT-2]}" )
(){
# There may be more things we need to add to this typeset to
# protect bash functions from compsys special variable names
typeset -h words
$OPTARG "${args[@]}"
}
results+=( "${COMPREPLY[@]}" )
;;
G)
setopt nullglob
results+=( ${~OPTARG} )
unsetopt nullglob
;;
W) results+=( ${(Q)~=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
# (( $# >= OPTIND)) && results=( "${(M)results[@]:#${@[-1]}*}" )
print -l -r -- "$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 -Uz bashcompinit
return 0