mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-19 21:44:11 +01:00
173 lines
4.6 KiB
Plaintext
173 lines
4.6 KiB
Plaintext
|
#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
|